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.