Andere Antworten haben die Vor- und Nachteile Ihrer verschiedenen Optionen gekonnt umrissen.
Ich glaube, dass Ihre Option 1 (Property Bag) das beste Gesamtdesign für die meisten Anwendungen ist, insbesondere wenn Sie einige Schutzmaßnahmen gegen die Schwächen von Property Bags einbauen.
Siehe folgende ERD:
In der obigen ERD die USER_SETTING
Tabelle ist OP sehr ähnlich. Der Unterschied besteht darin, dass anstelle von varchar Code
und Value
Spalten, dieses Design hat ein FK zu einem SETTING
Tabelle, die die zulässigen Einstellungen (Codes) definiert, und zwei sich gegenseitig ausschließende Spalten für den Wert. Eine Option ist ein varchar-Feld, das jede Art von Benutzereingabe annehmen kann, die andere ist ein FK zu einer Tabelle mit zulässigen Werten.
Die SETTING
table hat auch ein Flag, das angibt, ob Benutzereinstellungen durch den FK oder durch uneingeschränkte Varchar-Eingabe definiert werden sollen. Sie können auch einen data_type
hinzufügen zu den SETTING
um dem System mitzuteilen, wie es USER_SETTING.unconstrained_value
kodieren und interpretieren soll . Wenn Sie möchten, können Sie auch die SETTING_GROUP
hinzufügen Tabelle, um die verschiedenen Einstellungen für die Benutzerverwaltung zu organisieren.
Dieses Design ermöglicht es Ihnen, die Regeln für Ihre Einstellungen zu steuern. Dies ist praktisch, flexibel und wartungsfreundlich, während ein Free-for-all vermieden wird.
BEARBEITEN: Ein paar weitere Details, darunter einige Beispiele...
Beachten Sie, dass die ERD oben um mehr Spaltendetails erweitert wurde (Bereichswerte auf SETTING und Spalten auf ALLOWED_SETTING_VALUE).
Hier sind einige Beispieldatensätze zur Veranschaulichung.
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 |
+------+---------+------------+--------------------------+---------------------+
Aus diesen Tabellen können wir ersehen, dass einige der bestimmbaren Benutzereinstellungen Lieblingsfarbe, Artikel-Max-Limit und Artikel-Min-Limit sind. Lieblingsfarbe ist eine Auswahlliste mit alphanumerischen Zeichen. Min.- und Max.-Grenzwerte für Elemente sind Zahlenwerte mit festgelegten zulässigen Bereichswerten. Die SETTING.constrained
Spalte bestimmt, ob Benutzer aus dem zugehörigen ALLOWED_SETTING_VALUE
auswählen s oder ob sie einen USER_SETTING.unconstrained_value
eingeben müssen . Die GUI, die es Benutzern ermöglicht, mit ihren Einstellungen zu arbeiten, muss verstehen, welche Option angeboten werden soll und wie sowohl der SETTING.data_type
erzwungen wird und der min_value
und max_value
Grenzen, falls vorhanden.
Mit diesem Design können Sie die zulässigen Einstellungen tabellarisch steuern, einschließlich genügend Metadaten, um einige rudimentäre Einschränkungen/Zuverlässigkeitsprüfungen für die von Benutzern ausgewählten (oder eingegebenen) Werte zu erzwingen.
BEARBEITEN:Beispielabfrage
Hier ist ein SQL-Beispiel, das die obigen Daten verwendet, um die Einstellungswerte für eine bestimmte Benutzer-ID aufzulisten:
-- 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')
;
Und jetzt die DML zum Extrahieren der Einstellungen eines Benutzers:
-- 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
Siehe dies in SQL Fiddle.