sql >> Base de Datos >  >> RDS >> Mysql

¿La mejor manera de almacenar la configuración del usuario en MySQL?

Para cualquier cosa que sea siempre establecido para cada usuario, debe tender a mantener eso en Users tabla, según la normalización habitual. En cuanto a la configuración opcional, tiendo a gustarme la siguiente estructura de tabla:

TABLE Users:
  id INT AI
  name VARCHAR
  ...

TABLE User_Settings
  user_id INT PK,FK
  name VARCHAR PK
  type BOOL
  value_int INT NULL
  value_str VARCHAR NULL

Donde User_Settings.type especifica si se debe hacer referencia al campo entero o de cadena.

es decir:

INSERT INTO Users (id, name) VALUES (1, 'Sammitch');
INSERT INTO User_Settings (user_id, name, type, value_int) VALUES (1, 'level', 1, 75);
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'en');

Y para el problema INSERTAR/ACTUALIZAR:

INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
  ON DUPLICATE KEY UPDATE value_str='fr';

Además, como dice la mayoría de la gente, serializar y almacenar las preferencias no es una idea particularmente buena porque:

  1. No puede recuperar un solo valor con una consulta, debe recuperar la cadena serializada completa, deserializarla y descartar los datos innecesarios.
  2. Es fácilmente corruptible y difícil de recuperar.
  3. Es un fastidio escribir una consulta sin procesar, es decir, corregir globalmente una configuración determinada.
  4. Está almacenando lo que son esencialmente datos tabulares dentro de un solo campo de tabla.

Edición retrospectiva de septiembre de 2016:

Mientras tanto, tuve algunas discusiones con la gente sobre la mejor manera de almacenar configuraciones opcionales, así como la estructura general de la tabla definida anteriormente.

Si bien la estructura de la tabla no es del todo mala , no es exactamente bueno o. Es tratar de sacar lo mejor de una mala situación. La serialización de configuraciones opcionales puede funcionar siempre que pueda adaptarse a estas configuraciones:

  1. Todo se carga a la vez, sin seleccionar ni elegir.
  2. No ser indexable, buscar o modificar fácilmente en masa .

Entonces podría considerar agregar un campo como optional_settings en los Users tabla que contiene una forma serializada [por ejemplo:JSON] de la configuración. Intercambia lo anterior, pero es un enfoque más sencillo y puede almacenar configuraciones más complejas.

Además, si usa un tipo LOB como TEXT para el almacenamiento, los datos no se almacenan necesariamente "en la fila", al menos en MySQL.

De todos modos, depende de usted para determinar cuáles son los requisitos y limitaciones de su aplicación y tomar la mejor decisión en función de esa información.