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.