sql >> Databáze >  >> RDS >> Sqlserver

Návrh databáze pro uživatelská nastavení

Další odpovědi obratně načrtly klady a zápory vašich různých možností.

Domnívám se, že vaše varianta 1 (kabelka) je nejlepší celkový design pro většinu aplikací, zvláště pokud zabudujete ochranu proti slabým stránkám vaků.

Viz následující ERD:

Ve výše uvedeném ERD je USER_SETTING tabulka je velmi podobná OP. Rozdíl je v tom, že místo varchar Code a Value sloupců, tento návrh má FK k SETTING tabulka, která definuje povolená nastavení (Kódy) a dva vzájemně se vylučující sloupce pro hodnotu. Jednou z možností je pole varchar, které může přijmout jakýkoli druh uživatelského vstupu, druhou možností je FK k tabulce právních hodnot.

SETTING tabulka má také příznak, který označuje, zda by uživatelská nastavení měla být definována pomocí FK nebo neomezeným vstupem varchar. Můžete také přidat data_type do SETTING sdělit systému, jak kódovat a interpretovat USER_SETTING.unconstrained_value . Pokud chcete, můžete také přidat SETTING_GROUP tabulka, která vám pomůže uspořádat různá nastavení pro uživatelskou údržbu.

Tento design vám umožňuje řídit pravidla podle vašich nastavení. To je pohodlné, flexibilní a snadno se udržuje, aniž by to bylo zdarma pro všechny.

UPRAVIT: Několik dalších podrobností, včetně několika příkladů...

Všimněte si, že výše uvedená ERD byla rozšířena o další podrobnosti sloupců (rozsah hodnot na SETTING a sloupce na ALLOWED_SETTING_VALUE).

Zde je několik ukázkových záznamů pro ilustraci.

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                   |
+------+---------+------------+--------------------------+---------------------+

Z těchto tabulek vidíme, že některá uživatelská nastavení, která lze určit, jsou oblíbená barva, maximální limit položky a minimální limit položky. Oblíbená barva je výběrový seznam alfanumerických znaků. Položka min a max limity jsou numerické s nastavenými hodnotami povoleného rozsahu. SETTING.constrained určuje, zda uživatelé vybírají ze související ALLOWED_SETTING_VALUE s nebo zda potřebují zadat USER_SETTING.unconstrained_value . GUI, které uživatelům umožňuje pracovat se svými nastaveními, musí rozumět tomu, kterou možnost nabídnout a jak vynutit SETTING.data_type a min_value a max_value limity, pokud existují.

Pomocí tohoto návrhu můžete řídit přípustná nastavení včetně dostatečného množství metadat k vynucení některých základních omezení/kontroly zdravého rozumu u hodnot vybraných (nebo zadaných) uživateli.

UPRAVIT:Příklad dotazu

Zde je několik ukázkových SQL, které používají výše uvedená data k seznamu hodnot nastavení pro dané ID uživatele:

-- 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')
;

A nyní DML pro extrakci uživatelských nastavení:

-- 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

Podívejte se na to v SQL Fiddle.



  1. MySQL:Jak se připojím ke stejné tabulce vícekrát?

  2. Jak vytvořit tabulku pomocí databáze sqlite v Androidu?

  3. 1052:Sloupec 'id' v seznamu polí je nejednoznačný

  4. Jak migrovat databázi WHMCS do MariaDB Galera Cluster