在MySQL中存储用户设置的最佳方式?

Pra*_*ash 12 php mysql

我只是想知道为我的Web应用程序存储用户特定设置的最佳方法是什么?只是偏好用户可能有.我想到了两个选择:

  1. 用户表 - 我将为我的用户提供一个表.创建一个名为"preferences"的列,并将序列化数据存储在key => value对中

  2. 设置表 - 使用user_id列创建一个名为settings的单独表.以相同的方式保存设置

任何输入将不胜感激.谢谢 :)!

-

编辑:只是添加,如果我没有序列化/ json或任何数据放入数据,我必须有一个列为每个设置.

Sam*_*tch 24

对于总是每个用户设置的任何内容,您应该倾向于将其保留在Users表中,按照通常的规范化.至于可选配置,我倾向于喜欢下面的表结构:

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
Run Code Online (Sandbox Code Playgroud)

Where User_Settings.type指定是否应引用整数或字符串字段.

即:

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');
Run Code Online (Sandbox Code Playgroud)

对于INSERT/UPDATE问题:

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

此外,正如大多数其他人所说,序列化和存储首选项并不是一个特别好的主意,因为:

  1. 您无法使用查询检索单个值,您必须检索整个序列化字符串,对其进行反序列化并丢弃不必要的数据.
  2. 它容易腐败,难以恢复.
  3. 编写原始查询的讽刺是痛苦的,即:全局修复某个设置.
  4. 您将在单个表字段中存储基本上是表格的数据.

2016年9月回顾编辑:

在这段时间里,我与人们讨论了如何最好地存储可选设置,以及上面定义的一般表结构.

虽然那个表结构并不完全糟糕,但它也不是很好.它试图充分利用糟糕的情况.只要您可以适应这些设置,可选设置的序列化就可以工作:

  1. 所有都是一次装载,没有挑选或选择.
  2. 没有被编入索引,搜索,或轻易修改集体.

然后,您可以考虑optional_settingsUsers表中添加一个包含设置的序列化[eg:JSON]形式的字段.你做了以上的交易,但这是一种更简单的方法,你可以存储更复杂的设置.

此外,如果您使用类似TEXT存储的LOB类型,则数据不一定存储在"行中",至少在MySQL中.

无论如何,由决定应用程序的要求和约束是什么,并根据该信息做出最佳选择.