Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Progettazione del database per le impostazioni dell'utente

Altre risposte hanno abilmente delineato i pro ei contro delle tue varie opzioni.

Ritengo che la tua Opzione 1 (borsa per gli oggetti) sia il miglior design complessivo per la maggior parte delle applicazioni, soprattutto se incorpori alcune protezioni contro i punti deboli dei sacchi per gli oggetti.

Vedi il seguente ERD:

Nell'ERD sopra, il USER_SETTING la tabella è molto simile a quella di OP. La differenza è che invece di varchar Code e Value colonne, questo disegno ha un FK su un SETTING tabella che definisce le impostazioni consentite (Codici) e due colonne che si escludono a vicenda per il valore. Un'opzione è un campo varchar che può accettare qualsiasi tipo di input dell'utente, l'altra è un FK in una tabella di valori legali.

Il SETTING table ha anche un flag che indica se le impostazioni utente devono essere definite dall'FK o dall'input varchar non vincolato. Puoi anche aggiungere un data_type al SETTING per dire al sistema come codificare e interpretare il USER_SETTING.unconstrained_value . Se lo desideri, puoi anche aggiungere il SETTING_GROUP tabella per aiutare a organizzare le varie impostazioni per la manutenzione dell'utente.

Questo design ti consente di guidare le regole su quali sono le tue impostazioni. Questo è comodo, flessibile e di facile manutenzione, evitando al contempo un servizio gratuito per tutti.

MODIFICA: Qualche dettaglio in più, inclusi alcuni esempi...

Nota che l'ERD, sopra, è stato ampliato con più dettagli di colonna (valori di intervallo su SETTING e colonne su ALLOWED_SETTING_VALUE).

Di seguito sono riportati alcuni record di esempio a scopo illustrativo.

SETTING:
+----+------------------+-------------+--------------+-----------+-----------+
| id | description      | constrained | data_type    | min_value | max_value |
+----+------------------+-------------+--------------+-----------+-----------+
| 10 | Favourite Colour | true        | alphanumeric | {null}    | {null}    |
| 11 | Item Max Limit   | false       | integer      | 0         | 9001      |
| 12 | Item Min Limit   | false       | integer      | 0         | 9000      |
+----+------------------+-------------+--------------+-----------+-----------+

ALLOWED_SETTING_VALUE:
+-----+------------+--------------+-----------+
| id  | setting_id | item_value   | caption   |
+-----+------------+--------------+-----------+
| 123 | 10         | #0000FF      | Blue      |
| 124 | 10         | #FFFF00      | Yellow    |
| 125 | 10         | #FF00FF      | Pink      |
+-----+------------+--------------+-----------+

USER_SETTING:
+------+---------+------------+--------------------------+---------------------+
| id   | user_id | setting_id | allowed_setting_value_id | unconstrained_value |
+------+---------+------------+--------------------------+---------------------+
| 5678 | 234     | 10         | 124                      | {null}              |
| 7890 | 234     | 11         | {null}                   | 100                 |
| 8901 | 234     | 12         | {null}                   | 1                   |
+------+---------+------------+--------------------------+---------------------+

Da queste tabelle, possiamo vedere che alcune delle impostazioni utente che possono essere determinate sono Colore preferito, Limite massimo articolo e Limite minimo articolo. Colore preferito è un elenco di selezione di caratteri alfanumerici. I limiti minimo e massimo dell'elemento sono valori numerici con valori di intervallo consentiti impostati. Il SETTING.constrained la colonna determina se gli utenti stanno selezionando dal relativo ALLOWED_SETTING_VALUE se devono inserire un USER_SETTING.unconstrained_value . La GUI che consente agli utenti di lavorare con le loro impostazioni deve capire quale opzione offrire e come applicare sia il SETTING.data_type e il min_value e max_value limiti, se esistono.

Usando questo design, puoi tabella guidare le impostazioni consentite, inclusi metadati sufficienti per imporre alcuni vincoli rudimentali/controlli di integrità sui valori selezionati (o inseriti) dagli utenti.

EDIT:query di esempio

Ecco alcuni esempi di SQL che utilizzano i dati precedenti per elencare i valori di impostazione per un determinato ID utente:

-- DDL and sample data population...
CREATE TABLE SETTING
    (`id` int, `description` varchar(16)
     , `constrained` varchar(5), `data_type` varchar(12)
     , `min_value` varchar(6) NULL , `max_value` varchar(6) NULL)
;

INSERT INTO SETTING
    (`id`, `description`, `constrained`, `data_type`, `min_value`, `max_value`)
VALUES
    (10, 'Favourite Colour', 'true', 'alphanumeric', NULL, NULL),
    (11, 'Item Max Limit', 'false', 'integer', '0', '9001'),
    (12, 'Item Min Limit', 'false', 'integer', '0', '9000')
;

CREATE TABLE ALLOWED_SETTING_VALUE
    (`id` int, `setting_id` int, `item_value` varchar(7)
     , `caption` varchar(6))
;

INSERT INTO ALLOWED_SETTING_VALUE
    (`id`, `setting_id`, `item_value`, `caption`)
VALUES
    (123, 10, '#0000FF', 'Blue'),
    (124, 10, '#FFFF00', 'Yellow'),
    (125, 10, '#FF00FF', 'Pink')
;

CREATE TABLE USER_SETTING
    (`id` int, `user_id` int, `setting_id` int
     , `allowed_setting_value_id` varchar(6) NULL
     , `unconstrained_value` varchar(6) NULL)
;

INSERT INTO USER_SETTING
    (`id`, `user_id`, `setting_id`, `allowed_setting_value_id`, `unconstrained_value`)
VALUES
    (5678, 234, 10, '124', NULL),
    (7890, 234, 11, NULL, '100'),
    (8901, 234, 12, NULL, '1')
;

E ora il DML per estrarre le impostazioni di un utente:

-- Show settings for a given user
select
  US.user_id 
, S1.description 
, S1.data_type 
, case when S1.constrained = 'true'
  then AV.item_value
  else US.unconstrained_value
  end value
, AV.caption
from USER_SETTING US
  inner join SETTING S1
    on US.setting_id = S1.id 
  left outer join ALLOWED_SETTING_VALUE AV
    on US.allowed_setting_value_id = AV.id
where US.user_id = 234

Vedi questo in SQL Fiddle.