Andre svar har dygtigt skitseret fordele og ulemper ved dine forskellige muligheder.
Jeg mener, at din mulighed 1 (ejendomstaske) er det bedste overordnede design til de fleste applikationer, især hvis du indbygger nogle beskyttelser mod svaghederne ved ejendomsposer.
Se følgende ERD:
I ovenstående ERD er USER_SETTING
tabellen er meget lig OP's. Forskellen er, at i stedet for varchar Code
og Værdi
kolonner, har dette design en FK til en SETTING
tabel, som definerer de tilladte indstillinger (koder) og to gensidigt udelukkende kolonner for værdien. Den ene mulighed er et varchar-felt, der kan tage enhver form for brugerinput, den anden er en FK til en tabel med juridiske værdier.
data_type
til INDSTILLING
for at fortælle systemet, hvordan det koder og fortolker USER_SETTING.unconstrained_value
. Hvis du vil, kan du også tilføje SETTING_GROUP
tabel for at hjælpe med at organisere de forskellige indstillinger for brugervedligeholdelse.
Dette design giver dig mulighed for at styre reglerne omkring, hvad dine indstillinger er. Dette er praktisk, fleksibelt og nemt at vedligeholde, samtidig med at man undgår en gratis-for-alle.
EDIT: Et par flere detaljer, herunder nogle eksempler...
Bemærk, at ERD ovenfor er blevet udvidet med flere kolonnedetaljer (intervalværdier på SETTING og kolonner på ALLOWED_SETTING_VALUE).
Her er nogle eksempler på poster til 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 |
+------+---------+------------+--------------------------+---------------------+
Fra disse tabeller kan vi se, at nogle af de brugerindstillinger, der kan bestemmes, er Favoritfarve, Vare Maks. Limit og Item Min Limit. Favoritfarve er en valgliste over alfanumeriske tegn. Punkt min og maks. grænser er numeriske med tilladte områdeværdier indstillet. SETTING.constrained
kolonnen bestemmer, om brugerne vælger fra den relaterede ALLOWED_SETTING_VALUE
s eller om de skal indtaste en USER_SETTING.unconstrained_value
. GUI'en, der giver brugerne mulighed for at arbejde med deres indstillinger, skal forstå, hvilken mulighed de skal tilbyde, og hvordan man håndhæver både SETTING.data_type
og min_value
og max_value
grænser, hvis de findes.
Ved at bruge dette design kan du angive de tilladte indstillinger, inklusive nok metadata til at gennemtvinge nogle rudimentære begrænsninger/sundhedstjek på de værdier, der er valgt (eller indtastet) af brugere.
EDIT:Eksempelforespørgsel
Her er nogle eksempler på SQL, der bruger ovenstående data til at angive indstillingsværdierne for et givet bruger-id:
-- 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')
;
Og nu DML til at udtrække en brugers indstillinger:
-- 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
Se dette i SQL Fiddle.