sql >> Databasteknik >  >> RDS >> Sqlserver

Databasdesign för användarinställningar

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.



  1. SQL-fråga dynamiskt tabellnamn i FOR

  2. Flytta SQL-data från en tabell till en annan

  3. Hur man lagrar data i unicode på hindi

  4. Hur man skapar kontrollbegränsning på flera kolumner i SQL Server - SQL Server / TSQL självstudie del 84