sql >> Base de Datos >  >> RDS >> Sqlserver

Diseño de base de datos para la configuración del usuario

Otras respuestas han descrito hábilmente los pros y los contras de sus diversas opciones.

Creo que su Opción 1 (bolsa de propiedad) es el mejor diseño general para la mayoría de las aplicaciones, especialmente si incorpora algunas protecciones contra las debilidades de las bolsas de propiedad.

Consulte el siguiente ERD:

En el ERD anterior, el USER_SETTING La tabla es muy similar a la de OP. La diferencia es que en lugar de varchar Code y Value columnas, este diseño tiene un FK a un SETTING tabla que define las configuraciones permitidas (Códigos) y dos columnas mutuamente excluyentes para el valor. Una opción es un campo varchar que puede tomar cualquier tipo de entrada del usuario, la otra es un FK a una tabla de valores legales.

El SETTING La tabla también tiene un indicador que indica si la configuración del usuario debe ser definida por el FK o por la entrada varchar sin restricciones. También puede agregar un data_type al SETTING para decirle al sistema cómo codificar e interpretar el USER_SETTING.unconstrained_value . Si lo desea, también puede agregar el SETTING_GROUP tabla para ayudar a organizar las diversas configuraciones para el mantenimiento del usuario.

Este diseño le permite controlar las reglas en torno a cuáles son sus configuraciones. Esto es conveniente, flexible y fácil de mantener, al mismo tiempo que evita un juego gratuito.

EDITAR: Algunos detalles más, incluidos algunos ejemplos...

Tenga en cuenta que el ERD anterior se ha aumentado con más detalles de columna (valores de rango en CONFIGURACIÓN y columnas en ALLOWED_SETTING_VALUE).

Aquí hay algunos registros de muestra para ilustración.

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

En estas tablas, podemos ver que algunas de las configuraciones de usuario que se pueden determinar son el color favorito, el límite máximo del elemento y el límite mínimo del elemento. Color favorito es una lista de selección de caracteres alfanuméricos. Los límites mínimo y máximo de elementos son valores numéricos con valores de rango permitidos establecidos. El SETTING.constrained La columna determina si los usuarios seleccionan del ALLOWED_SETTING_VALUE relacionado s o si necesitan ingresar un USER_SETTING.unconstrained_value . La GUI que permite a los usuarios trabajar con su configuración debe comprender qué opción ofrecer y cómo hacer cumplir tanto el SETTING.data_type y el min_value y max_value límites, si existen.

Con este diseño, puede controlar en tablas las configuraciones permitidas, incluidos suficientes metadatos para aplicar algunas restricciones rudimentarias/comprobaciones de cordura en los valores seleccionados (o ingresados) por los usuarios.

EDITAR:consulta de ejemplo

Aquí hay algunos ejemplos de SQL que usan los datos anteriores para enumerar los valores de configuración para una ID de usuario dada:

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

Y ahora el DML para extraer la configuración de un usuario:

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

Vea esto en SQL Fiddle.