数据库设计:使用数百个字段表示小值

时间:2011-11-14 01:32:55

标签: mysql database-design

我打算开发一个PHP Web App,它主要由注册用户(会话)使用

在考虑数据库设计的同时,我正在考虑为了尽可能提供最佳用户体验,用户可以有很多选项来激活,停用,指定等。

例如:
- 每个布局元素,对话框,仪表板,网格等的选项 - 颜色,大小,保持可见,不可见,不要再问,每次显示,高级模式,简单模式等。

对于每个用户来说,这将是100个字段,范围从简单的是/否或1到N值....

那么,它是否为每个选项提供了一个字段? 或者这些CRM或CMS或其他Web应用程序如何存储大量1-2个字符长的值?

他们是否将它们分组在由特殊字符分隔的文本字段上,然后将它们“爆炸”为运行时使用的数组?

谢谢

3 个答案:

答案 0 :(得分:4)

这样的事情怎么样:

CREATE TABLE settings (
    user_id INT,
    setting_name VARCHAR(255),
    setting_value CHAR(2)
)

这样,要存储用户的配置设置,您可以执行以下操作:

INSERT INTO settings (user_id, setting_name, setting_value),
    VALUES (1, "timezone", "+8")

当您需要查询特定用户的设置时,您可以执行以下操作:

SELECT setting_value FROM settings
    WHERE user_id = 1 AND setting_name = "timezone"

答案 1 :(得分:2)

我绝对倾向于为每个选项设置单独的字段。我的经验法则是每列尽可能保存一条数据。不多也不少。如前所述,维护的简易性和在路上添加/删除选项的能力远远超过设置它的痛苦。但是,我会考虑如何创建表格。前面提到的想法是拥有一个包含100列(每个选项一个)的Settings表,每个用户一行。那肯定会有用。如果是我,我会倾向于进一步分解它。当然,您从一个基本的User表开始。这将保留用户名,密码,用户ID等的基础知识。这样,您可以使用数字用户标识作为您的设置表的关键索引。但之后我会尝试根据逻辑用法将设置分解为更小的表。例如,如果您有100个选项,其中19个与用户在网站的某个特定部分中查看/查看/行为的方式有关,比如论坛,请将这些选项分解为单独的表格,即ForumSettings。也许还有12个与电子邮件首选项有关,但不会在网站/应用程序的其他区域使用。现在您有一个EmailSettings表。这样做不仅可以减少通用设置表中的列数,而且还可以更轻松地为特定任务或应用程序区域编写查询,加快性能,并使维护向前发展变得更加痛苦。有些人可能不同意,从严格的数据建模角度来看,我很确定会指出一个“设置”表。但是从现实世界的角度来看,我从来没有使用像这样的逻辑块。

答案 2 :(得分:0)

从纯数据模型的角度来看,这将是最清晰的设计(虽然可怕的广泛)。出于假定的空间原因,有些人可能会尝试将它们按位掩码到单个字段中,但在我看来,编码/解码的逻辑使这不值得。你也失去了索引它们的能力。 另一个选项(我刚看到发布)是将一个单独的表与FK一起保存回用户表。但是,您必须迭代结果才能获得要检查的值。