sql >> Database teknologi >  >> RDS >> Sqlserver

Databasedesign til brugerindstillinger

Andre svar har dygtigt skitseret fordele og ulemper ved dine forskellige muligheder.

Jeg mener, at din mulighed 1 (ejendomstaske) er det bedste overordnede design til de fleste applikationer, især hvis du indbygger nogle beskyttelser mod svaghederne ved ejendomsposer.

Se følgende ERD:

I ovenstående ERD er USER_SETTING tabellen er meget lig OP's. Forskellen er, at i stedet for varchar Code og Værdi kolonner, har dette design en FK til en SETTING tabel, som definerer de tilladte indstillinger (koder) og to gensidigt udelukkende kolonner for værdien. Den ene mulighed er et varchar-felt, der kan tage enhver form for brugerinput, den anden er en FK til en tabel med juridiske værdier.

INDSTILLING tabellen har også et flag, der angiver, om brugerindstillinger skal defineres af FK'en eller af ubegrænset varchar-input. Du kan også tilføje en data_type til INDSTILLING for at fortælle systemet, hvordan det koder og fortolker USER_SETTING.unconstrained_value . Hvis du vil, kan du også tilføje SETTING_GROUP tabel for at hjælpe med at organisere de forskellige indstillinger for brugervedligeholdelse.

Dette design giver dig mulighed for at styre reglerne omkring, hvad dine indstillinger er. Dette er praktisk, fleksibelt og nemt at vedligeholde, samtidig med at man undgår en gratis-for-alle.

EDIT: Et par flere detaljer, herunder nogle eksempler...

Bemærk, at ERD ovenfor er blevet udvidet med flere kolonnedetaljer (intervalværdier på SETTING og kolonner på ALLOWED_SETTING_VALUE).

Her er nogle eksempler på poster til 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                   |
+------+---------+------------+--------------------------+---------------------+

Fra disse tabeller kan vi se, at nogle af de brugerindstillinger, der kan bestemmes, er Favoritfarve, Vare Maks. Limit og Item Min Limit. Favoritfarve er en valgliste over alfanumeriske tegn. Punkt min og maks. grænser er numeriske med tilladte områdeværdier indstillet. SETTING.constrained kolonnen bestemmer, om brugerne vælger fra den relaterede ALLOWED_SETTING_VALUE s eller om de skal indtaste en USER_SETTING.unconstrained_value . GUI'en, der giver brugerne mulighed for at arbejde med deres indstillinger, skal forstå, hvilken mulighed de skal tilbyde, og hvordan man håndhæver både SETTING.data_type og min_value og max_value grænser, hvis de findes.

Ved at bruge dette design kan du angive de tilladte indstillinger, inklusive nok metadata til at gennemtvinge nogle rudimentære begrænsninger/sundhedstjek på de værdier, der er valgt (eller indtastet) af brugere.

EDIT:Eksempelforespørgsel

Her er nogle eksempler på SQL, der bruger ovenstående data til at angive indstillingsværdierne for et givet bruger-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')
;

Og nu DML til at udtrække en brugers indstillinger:

-- 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 dette i SQL Fiddle.



  1. Analyse af PostgreSQL-tabelstatistik

  2. Sådan genereres DB-testdata

  3. NextForm v3:Fem muligheder for data- og databasemigrering

  4. PostgreSQL:Forespørgsel har ingen destination for resultatdata