Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Conception de la base de données pour les paramètres utilisateur

D'autres réponses ont habilement décrit les avantages et les inconvénients de vos différentes options.

Je pense que votre Option 1 (sac de propriété) est la meilleure conception globale pour la plupart des applications, surtout si vous intégrez des protections contre les faiblesses des sacs de propriété.

Voir l'ERD suivant :

Dans l'ERD ci-dessus, le USER_SETTING table est très similaire à OP. La différence est qu'au lieu de varchar Code et Value colonnes, cette conception a un FK à un SETTING tableau qui définit les paramètres autorisés (codes) et deux colonnes mutuellement exclusives pour la valeur. Une option est un champ varchar qui peut accepter n'importe quel type d'entrée utilisateur, l'autre est un FK vers une table de valeurs légales.

Le SETTING table a également un indicateur qui indique si les paramètres utilisateur doivent être définis par le FK ou par une entrée varchar sans contrainte. Vous pouvez également ajouter un data_type au SETTING pour dire au système comment encoder et interpréter le USER_SETTING.unconstrained_value . Si vous le souhaitez, vous pouvez également ajouter le SETTING_GROUP tableau pour aider à organiser les différents paramètres pour la maintenance de l'utilisateur.

Cette conception vous permet de définir les règles de vos paramètres. C'est pratique, flexible et facile à entretenir, tout en évitant un chacun pour soi.

MODIF : Quelques détails supplémentaires, dont quelques exemples...

Notez que l'ERD, ci-dessus, a été augmenté avec plus de détails sur les colonnes (valeurs de plage sur SETTING et colonnes sur ALLOWED_SETTING_VALUE).

Voici quelques exemples d'enregistrements à titre d'illustration.

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                   |
+------+---------+------------+--------------------------+---------------------+

À partir de ces tableaux, nous pouvons voir que certains des paramètres utilisateur qui peuvent être déterminés sont la couleur préférée, la limite maximale d'articles et la limite minimale d'articles. La couleur préférée est une liste de sélection de caractères alphanumériques. Les limites minimales et maximales de l'élément sont des valeurs numériques avec des valeurs de plage autorisées définies. Le SETTING.constrained la colonne détermine si les utilisateurs sélectionnent à partir du ALLOWED_SETTING_VALUE associé s ou s'ils doivent entrer un USER_SETTING.unconstrained_value . L'interface graphique qui permet aux utilisateurs de travailler avec leurs paramètres doit comprendre quelle option offrir et comment appliquer à la fois le SETTING.data_type et la min_value et max_value limites, si elles existent.

À l'aide de cette conception, vous pouvez tabler les paramètres autorisés, y compris suffisamment de métadonnées pour appliquer certaines contraintes rudimentaires/vérifications d'intégrité sur les valeurs sélectionnées (ou saisies) par les utilisateurs.

MODIFIER :Exemple de requête

Voici un exemple de code SQL utilisant les données ci-dessus pour répertorier les valeurs de paramètre pour un ID utilisateur donné :

-- 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')
;

Et maintenant le DML pour extraire les paramètres d'un utilisateur :

-- 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

Voir ceci dans SQL Fiddle.