Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Datenbankdesign für Benutzereinstellungen

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.