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

2022-08-31 00:38:42

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

  1. 用户表 - 我将为我的用户提供一个表。创建一个名为“首选项”的列,并将序列化数据存储在键 = > 值对中

  2. 设置表 - 具有一个名为“设置”的单独表,其中包含user_id列。以相同的方式保存设置

任何意见将不胜感激。谢谢:)!

--

编辑:只是为了补充,如果我没有序列化/ json或任何要放入数据中的数据,我必须为每个设置设置一列。


答案 1

对于始终为每个用户设置的任何内容,您应该按照通常的规范化将其保留在表中。至于可选配置,我倾向于喜欢下表结构: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

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');

对于插入/更新问题:

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

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

  1. 不能使用查询检索单个值,必须检索整个序列化字符串,对其进行反序列化,然后丢弃不必要的数据。
  2. 它很容易损坏,并且难以恢复。
  3. 编写原始查询是一件痛苦的事情,即:全局修复某个设置。
  4. 您将实质上属于表格的数据存储在单个表字段中。

2016年9月回顾编辑:

在此期间,我与人们就如何最好地存储可选设置以及上面定义的一般表结构进行了一些争论。

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

  1. 全部一次性加载,无需挑选或选择。
  2. 不可索引、不可搜索或易于集体修改。

然后,您可以考虑添加一个字段,例如在包含序列化[例如:JSON]形式的设置的表中。您确实在上述方面进行了权衡,但这是一种更直接的方法,您可以存储更复杂的设置。optional_settingsUsers

此外,如果您使用诸如存储之类的LOB类型,则数据不一定至少存储在MySQL中的“行中”。TEXT

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


答案 2

这完全取决于数据库的设置和架构。无论你做什么,我都会建议不要按照你的建议1序列化数据,如果你序列化数据,你不能再写针对它的查询,你需要使用你序列化它的相同语言反序列化它(或者用该语言编写类似的东西)。

我建议的选项是将设置放在 users 表中,每列 1 个设置。这样做的缺点是,当您向应用程序添加新设置时,必须编写一些DDL脚本来添加新列。一个(非常好的)优点是每个设置都可以有自己的数据类型。如果此设置是可选的,这也会产生存储损失。

另一种选择可能是使用设置表,如您所建议的那样,主键为(user_id,setting_name),第三列为设置值。此解决方案假定所有设置都具有相同的数据类型。您无需编写 DDL 脚本即可添加新设置,只需使用新的键名即可。


推荐