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:
- 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.
- É facilmente corruptível e difícil de recuperar.
- É uma dor de cabeça escrever uma consulta bruta, ou seja:para corrigir globalmente uma determinada configuração.
- 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:
- Tudo sendo carregado de uma vez, sem escolha ou escolha.
- 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.