用户首选项是否应包含在用户表中?

时间:2010-05-05 17:41:42

标签: sql mysql

我正在创建一个成员网站,我目前正在处理用户首选项设置。我应该创建一个包含所有首选项字段(大约17个字段)的表,还是应该将它们与帐户设置一起包含在主成员表中?

表格中应该有多少字段是否有限制?目前成员表有大约21个字段...当我可以轻松地将它们放在另一个表中时,不确定是否可以添加另外17个字段。虽然有任何建议,但需要更多编码来提取数据?

4 个答案:

答案 0 :(得分:3)

我会将它们分开以保持可维护性。一个查询可以拉出所有这些。差异应该可以忽略不计

答案 1 :(得分:2)

分为三个表:

  • MEMBERS
  • PREFERENCE_TYPE_CODE
  • MEMBER_PREFERENCES

MySQL有一个hard limit of 4,096 columns,但依靠这些知识并不理想。上面的表结构允许您添加或删除首选项,而无需使用ALTER TABLE语句。它还将支持查询具体给定偏好的人。

答案 2 :(得分:0)

取决于。

对于小型网站,将所有内容都塞入一个表可能需要较少的编码(不需要加入)。而且由于用户偏好似乎是1:1的用户帐户,这是我倾向于支持的。此外,对于连接,如果数据库已损坏或未正确约束,则可能存在给定用户不存在用户首选项。

表中字段的限制取决于您的引擎。 5.5的答案可以在http://dev.mysql.com/doc/refman/5.5/en/column-count-limit.html找到。

答案 3 :(得分:0)

21个领域相当多。这不是MySQL的问题,但我更喜欢单独的表。

如果稍后可能会有更多偏好,您甚至可以考虑首选项的通用3列表。列如下:

UserID
PreferenceName
PreferenceValue 

每个用户首​​选项占一行。您可能希望添加第4列以存储值列表。有效使用这种类型的数据库模型需要支持多个结果集(因此您可以一次性获取所有首选项的用户信息)。您可能想要检查数据库访问技术是否支持它们。

当然,使用这种方法,您将无法为每个首选项选择数据类型。作为优势,您可以扩展此模型以创建“首选项”表,您可以在其中为每个首选项定义默认值。

# Fetch all preferences for a user, using defaults where no preferences are given
SELECT p.PreferenceName, COALESCE(up.PreferenceValue, p.DefaultValue)
FROM Preference p
LEFT OUTER JOIN UserPreference up ON up.PreferenceID = p.ID
WHERE up.UserID = ?

这样您就可以轻松更改网站的默认设置。