Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Melhor maneira de armazenar as configurações do usuário no MySQL?


Para qualquer coisa que seja sempre definido para todos user você deve manter isso em Users tabela, por normalização usual. Quanto à configuração opcional, costumo gostar da seguinte estrutura de tabela:
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

Onde User_Settings.type especifica se o campo inteiro ou string deve ser referenciado.

ou seja:
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');

E para o problema INSERT/UPDATE:
INSERT INTO User_Settings (user_id, name, type, value_str) VALUES (1, 'lang', 0, 'fr')
  ON DUPLICATE KEY UPDATE value_str='fr';

Além disso, como a maioria das pessoas está dizendo, serializar e armazenar as preferências não é uma ideia particularmente boa porque:
  1. Você não pode recuperar um único valor com uma consulta, você deve recuperar toda a string serializada, desserializá-la e descartar os dados desnecessários.
  2. É facilmente corruptível e difícil de recuperar.
  3. É uma dor de cabeça escrever uma consulta bruta, ou seja:para corrigir globalmente uma determinada configuração.
  4. Você está armazenando dados essencialmente tabulares em um único campo de tabela.

Edição retrospectiva de setembro de 2016:


Nesse meio tempo, tive algumas discussões com as pessoas sobre a melhor forma de armazenar configurações opcionais, bem como a estrutura geral da tabela definida acima.

Embora essa estrutura de tabela não seja totalmente ruim , não é exatamente bom ou. É tentar tirar o melhor de uma situação ruim. A serialização de configurações opcionais pode funcionar desde que você possa acomodar essas configurações:
  1. Tudo sendo carregado de uma vez, sem escolha ou escolha.
  2. Não ser indexável, pesquisável ou facilmente modificável em massa .

Então você pode considerar adicionar um campo como optional_settings em Users tabela contendo um formulário serializado [por exemplo:JSON] das configurações. Você troca o acima, mas é uma abordagem mais direta e você pode armazenar configurações mais complexas.

Além disso, se você usar um tipo LOB como TEXT para armazenamento, os dados não são necessariamente armazenados "na linha", pelo menos no MySQL.

De qualquer forma, depende de você para determinar quais são os requisitos e restrições do seu aplicativo e fazer a melhor escolha com base nessas informações.