Andra svar har skickligt beskrivit för- och nackdelarna med dina olika alternativ.
Jag tror att ditt alternativ 1 (egendomsväska) är den bästa övergripande designen för de flesta applikationer, speciellt om du bygger in vissa skydd mot svagheterna hos fastighetspåsar.
Se följande ERD:
I ovanstående ERD, USER_SETTING
Tabellen är mycket lik OP:s. Skillnaden är att istället för varchar Code
och Value
kolumner, har denna design en FK till en SETTING
tabell som definierar tillåtna inställningar (koder) och två ömsesidigt uteslutande kolumner för värdet. Det ena alternativet är ett varchar-fält som kan ta alla typer av användarinput, det andra är en FK till en tabell med lagliga värden.
SETTING
Tabellen har också en flagga som indikerar om användarinställningar ska definieras av FK eller av obegränsad varchar-ingång. Du kan också lägga till en data_type
till SETTING
för att tala om för systemet hur det ska koda och tolka USER_SETTING.unconstrained_value
. Om du vill kan du också lägga till SETTING_GROUP
tabell för att hjälpa till att organisera de olika inställningarna för användarunderhåll.
Denna design låter dig styra reglerna kring vad dina inställningar är. Detta är bekvämt, flexibelt och lätt att underhålla, samtidigt som man undviker en gratis-för-alla.
EDIT: Några fler detaljer, inklusive några exempel...
Observera att ERD ovan har utökats med fler kolumndetaljer (intervallvärden på SETTING och kolumner på ALLOWED_SETTING_VALUE).
Här är några exempel på poster för 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 |
+------+---------+------------+--------------------------+---------------------+
Från dessa tabeller kan vi se att några av användarinställningarna som kan bestämmas är Favoritfärg, Objekt Max gräns och Artikel Min Limit. Favoritfärg är en vallista med alfanumeriska tecken. Min- och maxgränser för objekt är numeriska värden med tillåtna intervallvärden inställda. SETTING.constrained
kolumnen avgör om användare väljer från den relaterade ALLOWED_SETTING_VALUE
s eller om de behöver ange en USER_SETTING.unconstrained_value
. Det grafiska användargränssnittet som tillåter användare att arbeta med sina inställningar måste förstå vilket alternativ de ska erbjuda och hur man tillämpar både SETTING.data_type
och min_value
och max_value
gränser, om de finns.
Med den här designen kan du tabelldriva de tillåtna inställningarna inklusive tillräckligt med metadata för att upprätthålla vissa rudimentära begränsningar/sanity-kontroller på de värden som valts (eller angetts) av användare.
EDIT:Exempelfråga
Här är några exempel på SQL som använder ovanstående data för att lista inställningsvärdena för ett givet användar-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')
;
Och nu DML för att extrahera en användares inställningar:
-- 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 detta i SQL Fiddle.