sql >> Database >  >> RDS >> Sqlserver

Databaseontwerp voor gebruikersinstellingen

Andere antwoorden hebben de voor- en nadelen van uw verschillende opties kundig geschetst.

Ik geloof dat uw optie 1 (eigendomstas) het beste algemene ontwerp is voor de meeste toepassingen, vooral als u een aantal beveiligingen inbouwt tegen de zwakke punten van eigendomstassen.

Zie de volgende ERD:

In de bovenstaande ERD, de USER_SETTING tabel lijkt erg op OP's. Het verschil is dat in plaats van varchar Code en Value kolommen, dit ontwerp heeft een FK naar een SETTING tabel die de toegestane instellingen definieert (Codes) en twee elkaar uitsluitende kolommen voor de waarde. Eén optie is een varchar-veld dat elke vorm van gebruikersinvoer kan aannemen, de andere is een FK naar een tabel met wettelijke waarden.

De SETTING tabel heeft ook een vlag die aangeeft of gebruikersinstellingen moeten worden gedefinieerd door de FK of door onbeperkte varchar-invoer. U kunt ook een data_type . toevoegen naar de SETTING om het systeem te vertellen hoe de USER_SETTING.unconstrained_value moet worden gecodeerd en geïnterpreteerd . Als je wilt, kun je ook de SETTING_GROUP . toevoegen tabel om de verschillende instellingen voor gebruikersonderhoud te helpen organiseren.

Met dit ontwerp kunt u de regels bepalen rond wat uw instellingen zijn. Dit is handig, flexibel en gemakkelijk te onderhouden, terwijl het voor iedereen gratis is.

BEWERKEN: Nog een paar details, inclusief enkele voorbeelden...

Houd er rekening mee dat de bovenstaande ERD is uitgebreid met meer kolomdetails (bereikwaarden op SETTING en kolommen op ALLOWED_SETTING_VALUE).

Hier zijn enkele voorbeeldrecords ter illustratie.

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

Uit deze tabellen kunnen we zien dat enkele van de gebruikersinstellingen die kunnen worden bepaald, favoriete kleur, maximale itemlimiet en itemminlimiet zijn. Favoriete kleur is een keuzelijst met alfanumerieke tekens. Item min en max limieten zijn numeriek met toegestane bereikwaarden. De SETTING.constrained kolom bepaalt of gebruikers kiezen uit de gerelateerde ALLOWED_SETTING_VALUE s of dat ze een USER_SETTING.unconstrained_value moeten invoeren . De GUI waarmee gebruikers met hun instellingen kunnen werken, moet begrijpen welke optie ze moeten aanbieden en hoe ze zowel de SETTING.data_type kunnen afdwingen. en de min_value en max_value limieten, als ze bestaan.

Met dit ontwerp kunt u de toegestane instellingen aansturen, inclusief voldoende metadata om enkele rudimentaire beperkingen/sanity-controles af te dwingen op de waarden die door gebruikers zijn geselecteerd (of ingevoerd).

BEWERK:voorbeeldquery

Hier is een voorbeeld-SQL die de bovenstaande gegevens gebruikt om de instellingswaarden voor een gegeven gebruikers-ID weer te geven:

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

En nu de DML om de instellingen van een gebruiker te extraheren:

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

Zie dit in SQL Fiddle.



  1. VarBinary vs Image SQL Server-gegevenstype om binaire gegevens op te slaan?

  2. Case in Select-verklaring

  3. Is het veilig om gebruikersnamen en wachtwoorden in de database op te slaan?

  4. Haal de database of een ander bestand op uit de interne opslag met behulp van run-as