Další odpovědi obratně načrtly klady a zápory vašich různých možností.
Domnívám se, že vaše varianta 1 (kabelka) je nejlepší celkový design pro většinu aplikací, zvláště pokud zabudujete ochranu proti slabým stránkám vaků.
Viz následující ERD:
Ve výše uvedeném ERD je USER_SETTING
tabulka je velmi podobná OP. Rozdíl je v tom, že místo varchar Code
a Value
sloupců, tento návrh má FK k SETTING
tabulka, která definuje povolená nastavení (Kódy) a dva vzájemně se vylučující sloupce pro hodnotu. Jednou z možností je pole varchar, které může přijmout jakýkoli druh uživatelského vstupu, druhou možností je FK k tabulce právních hodnot.
SETTING
tabulka má také příznak, který označuje, zda by uživatelská nastavení měla být definována pomocí FK nebo neomezeným vstupem varchar. Můžete také přidat data_type
do SETTING
sdělit systému, jak kódovat a interpretovat USER_SETTING.unconstrained_value
. Pokud chcete, můžete také přidat SETTING_GROUP
tabulka, která vám pomůže uspořádat různá nastavení pro uživatelskou údržbu.
Tento design vám umožňuje řídit pravidla podle vašich nastavení. To je pohodlné, flexibilní a snadno se udržuje, aniž by to bylo zdarma pro všechny.
UPRAVIT: Několik dalších podrobností, včetně několika příkladů...
Všimněte si, že výše uvedená ERD byla rozšířena o další podrobnosti sloupců (rozsah hodnot na SETTING a sloupce na ALLOWED_SETTING_VALUE).
Zde je několik ukázkových záznamů pro ilustraci.
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 |
+------+---------+------------+--------------------------+---------------------+
Z těchto tabulek vidíme, že některá uživatelská nastavení, která lze určit, jsou oblíbená barva, maximální limit položky a minimální limit položky. Oblíbená barva je výběrový seznam alfanumerických znaků. Položka min a max limity jsou numerické s nastavenými hodnotami povoleného rozsahu. SETTING.constrained
určuje, zda uživatelé vybírají ze související ALLOWED_SETTING_VALUE
s nebo zda potřebují zadat USER_SETTING.unconstrained_value
. GUI, které uživatelům umožňuje pracovat se svými nastaveními, musí rozumět tomu, kterou možnost nabídnout a jak vynutit SETTING.data_type
a min_value
a max_value
limity, pokud existují.
Pomocí tohoto návrhu můžete řídit přípustná nastavení včetně dostatečného množství metadat k vynucení některých základních omezení/kontroly zdravého rozumu u hodnot vybraných (nebo zadaných) uživateli.
UPRAVIT:Příklad dotazu
Zde je několik ukázkových SQL, které používají výše uvedená data k seznamu hodnot nastavení pro dané ID uživatele:
-- 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')
;
A nyní DML pro extrakci uživatelských nastavení:
-- 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
Podívejte se na to v SQL Fiddle.