Andere antwoorden hebben de voor- en nadelen van uw verschillende opties kundig geschetst.
Ik geloof dat uw optie 1 (eigendomstas) het beste algemene ontwerp is voor de meeste toepassingen, vooral als u een aantal beveiligingen inbouwt tegen de zwakke punten van eigendomstassen.
Zie de volgende ERD:
In de bovenstaande ERD, de USER_SETTING
tabel lijkt erg op OP's. Het verschil is dat in plaats van varchar Code
en Value
kolommen, dit ontwerp heeft een FK naar een SETTING
tabel die de toegestane instellingen definieert (Codes) en twee elkaar uitsluitende kolommen voor de waarde. Eén optie is een varchar-veld dat elke vorm van gebruikersinvoer kan aannemen, de andere is een FK naar een tabel met wettelijke waarden.
De SETTING
tabel heeft ook een vlag die aangeeft of gebruikersinstellingen moeten worden gedefinieerd door de FK of door onbeperkte varchar-invoer. U kunt ook een data_type
. toevoegen naar de SETTING
om het systeem te vertellen hoe de USER_SETTING.unconstrained_value
moet worden gecodeerd en geïnterpreteerd . Als je wilt, kun je ook de SETTING_GROUP
. toevoegen tabel om de verschillende instellingen voor gebruikersonderhoud te helpen organiseren.
Met dit ontwerp kunt u de regels bepalen rond wat uw instellingen zijn. Dit is handig, flexibel en gemakkelijk te onderhouden, terwijl het voor iedereen gratis is.
BEWERKEN: Nog een paar details, inclusief enkele voorbeelden...
Houd er rekening mee dat de bovenstaande ERD is uitgebreid met meer kolomdetails (bereikwaarden op SETTING en kolommen op ALLOWED_SETTING_VALUE).
Hier zijn enkele voorbeeldrecords ter illustratie.
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 |
+------+---------+------------+--------------------------+---------------------+
Uit deze tabellen kunnen we zien dat enkele van de gebruikersinstellingen die kunnen worden bepaald, favoriete kleur, maximale itemlimiet en itemminlimiet zijn. Favoriete kleur is een keuzelijst met alfanumerieke tekens. Item min en max limieten zijn numeriek met toegestane bereikwaarden. De SETTING.constrained
kolom bepaalt of gebruikers kiezen uit de gerelateerde ALLOWED_SETTING_VALUE
s of dat ze een USER_SETTING.unconstrained_value
moeten invoeren . De GUI waarmee gebruikers met hun instellingen kunnen werken, moet begrijpen welke optie ze moeten aanbieden en hoe ze zowel de SETTING.data_type
kunnen afdwingen. en de min_value
en max_value
limieten, als ze bestaan.
Met dit ontwerp kunt u de toegestane instellingen aansturen, inclusief voldoende metadata om enkele rudimentaire beperkingen/sanity-controles af te dwingen op de waarden die door gebruikers zijn geselecteerd (of ingevoerd).
BEWERK:voorbeeldquery
Hier is een voorbeeld-SQL die de bovenstaande gegevens gebruikt om de instellingswaarden voor een gegeven gebruikers-ID weer te geven:
-- 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')
;
En nu de DML om de instellingen van een gebruiker te extraheren:
-- 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
Zie dit in SQL Fiddle.