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

时间:2013-01-02 16:03:35

标签: php mysql

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

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

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

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

    -

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

6 个答案:

答案 0 :(得分:23)

对于为每个用户始终设置的任何内容,您应该倾向于将其保留在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

其中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 / UPDATE问题:

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. 您将在单个表格字段中存储基本上是表格的数据。
  5. 2016年9月回顾编辑:

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

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

    1. 一次装满,不挑选或选择。
    2. 不可转换,可搜索或轻松修改 en masse
    3. 然后,您可以考虑在optional_settings表中添加一个类似Users的字段,其中包含设置的序列化[eg:JSON]形式。你做了以上的交易,但这是一种更简单的方法,你可以存储更复杂的设置。

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

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

答案 1 :(得分:2)

这一切都取决于数据库的设置和架构。不管你做什么,我会建议对串行数据按照你的建议1,如果你序列化可以不再编写查询反对它的数据,你需要使用你序列化是同一种语言进行反序列化(或写一些类似的那种语言)。

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

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

答案 2 :(得分:1)

第二个选项,但分别修改了存储设置。不要将序列化数据存储在字段中,因为在这种情况下是不好的做法。

想一想:你就是这样的,你可以在那里存储用户的国家或者是否已经注册到你的新闻通讯中。后来..你需要知道有多少人来自俄罗斯。你是做什么?把它们一个接一个地解码它们并增加一个计数器? (或使用第二种方法,只运行一个简单的SELECT COUNT(id)查询?)

答案 3 :(得分:1)

它始终存在同样的问题:您需要多久更改一次这些数据?在我看来,拥有一个单独的表总是一个很好的解决方案,因为它分离了应用程序的不同方面。

拥有preferences列并不是一个好主意,恕我直言,因为每当您的用户更改其设置时,您必须序列化他的所有数据以将其存储在users表中,它是否只是一个update与一个单独的一个。如果您确实要将所有内容存储在users中,则应将设置划分为不同的列。

答案 4 :(得分:0)

我会使用设置表,因为它可以让以后更容易访问。当您尝试执行诸如在单个列中创建名称值对之类的操作时,您可能会在以后尝试设计查询以访问数据时遇到问题。

答案 5 :(得分:0)

这可能不适合您当前的情况,但NoSQL数据库(如Mongo)对此非常有用。例如,这是一个mongo数据库,每个用户对象实际上可以有不同的属性,你仍然可以搜索它们。

那就是说,对于你所处的情况,过去我会遵循这里提出的其他答案,并有一个单独的表格。这可以通过两种方式完成,有一个单独的表,您可以更轻松地修改列,并加入它。或者,一个更简单的解决方案,有一个单独的表,如

用户,参数,价值。

然后每个用户可以有不同的额外值。

最佳方法取决于您所需的表现等。