Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Projekt bazy danych dla ustawień użytkownika

Inne odpowiedzi umiejętnie przedstawiły zalety i wady różnych opcji.

Uważam, że Twoja Opcja 1 (torba na własność) jest najlepszą ogólną konstrukcją dla większości zastosowań, zwłaszcza jeśli wbudujesz pewne zabezpieczenia przed słabościami toreb na własność.

Zobacz następujący ERD:

W powyższym ERD USER_SETTING tabela jest bardzo podobna do OP. Różnica polega na tym, że zamiast varchar Code i Value kolumn, ten projekt ma FK do SETTING tabela definiująca dopuszczalne ustawienia (Kody) oraz dwie wzajemnie wykluczające się kolumny dla wartości. Jedną z opcji jest pole varchar, które może pobierać dowolne dane wejściowe użytkownika, a drugą jest FK do tabeli prawidłowych wartości.

SETTING tabela ma również flagę wskazującą, czy ustawienia użytkownika powinny być definiowane przez FK, czy przez nieograniczone wejście varchar. Możesz także dodać data_type do SETTING aby poinformować system, jak kodować i interpretować USER_SETTING.unconstrained_value . Jeśli chcesz, możesz również dodać SETTING_GROUP tabela ułatwiająca organizowanie różnych ustawień obsługi użytkownika.

Ten projekt pozwala ci sterować regułami dotyczącymi twoich ustawień. Jest to wygodne, elastyczne i łatwe w utrzymaniu, unikając jednocześnie „darmowego dla wszystkich”.

EDYTUJ: Jeszcze kilka szczegółów, w tym kilka przykładów...

Zwróć uwagę, że powyżej ERD został rozszerzony o więcej szczegółów dotyczących kolumn (wartości zakresu w ustawieniu SETTING i kolumny w ustawieniu ALLOWED_SETTING_VALUE).

Oto kilka przykładowych rekordów dla ilustracji.

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 tych tabel widzimy, że niektóre ustawienia użytkownika, które można określić, to Ulubiony kolor, Maksymalny limit przedmiotu i Minimalny limit przedmiotu. Ulubiony kolor to lista wyboru znaków alfanumerycznych. Minimalne i maksymalne limity pozycji to wartości liczbowe z ustawionymi dopuszczalnymi wartościami zakresu. SETTING.constrained kolumna określa, czy użytkownicy wybierają z powiązanego ALLOWED_SETTING_VALUE s lub czy muszą wpisać USER_SETTING.unconstrained_value . GUI, który pozwala użytkownikom pracować z ich ustawieniami, musi wiedzieć, którą opcję oferować i jak wymusić zarówno SETTING.data_type i min_value i max_value ograniczenia, jeśli istnieją.

Korzystając z tego projektu, możesz sterować tabelą dopuszczalnych ustawień, w tym wystarczającą ilością metadanych, aby wymusić pewne podstawowe ograniczenia/kontrole poprawności dla wartości wybranych (lub wprowadzonych) przez użytkowników.

EDYCJA:Przykładowe zapytanie

Oto przykładowy kod SQL wykorzystujący powyższe dane do wyświetlenia wartości ustawień dla danego identyfikatora użytkownika:

-- 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 teraz DML do wyodrębnienia ustawień użytkownika:

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

Zobacz to w SQL Fiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź stan kolejek poczty bazy danych w programie SQL Server (T-SQL)

  2. Błąd serwera SQL 213:Nazwa kolumny lub liczba podanych wartości nie jest zgodna z definicją tabeli.

  3. Nie można obciąć tabeli, ponieważ odwołuje się do niej ograniczenie klucza obcego — SQL Server/TSQL Tutorial, część 70

  4. Po co używać klauzuli INCLUDE podczas tworzenia indeksu?

  5. Różnica czasu SQL między dwiema datami daje wynik gg:mm:ss