【发布时间】:2011-08-12 14:17:26
【问题描述】:
正如这个问题肯定会揭示的那样,我对数据库设计还比较陌生。请原谅我缺乏理解。
我想在数据库中存储如下值(来自 Google 日历的示例):
最好的方法是什么?这是一个数据库字段还是多个?
如果是前者,这是否违反规范化规则?
谢谢!
【问题讨论】:
正如这个问题肯定会揭示的那样,我对数据库设计还比较陌生。请原谅我缺乏理解。
我想在数据库中存储如下值(来自 Google 日历的示例):
最好的方法是什么?这是一个数据库字段还是多个?
如果是前者,这是否违反规范化规则?
谢谢!
【问题讨论】:
IMO,标准化是一门艺术。但是,我通常会采用像您的示例这样的字段并将它们保存在一张表中,因为我们永远不会超过 7 天。但是,如果有任何增长的机会,我会将其放在单独的表格中。
【讨论】:
如果选项是互斥的,那么您可以使用一个字段来存储选项。理想情况下为字段设置约束,以便只存储允许的值。
如果可以选择多个选项,则每个选项应该有一个字段,其值为“y”和“n”(或“t”/“f”代表真/假)。同样,您应该添加一个约束以仅允许这些值。如果您的 DBMS 支持,请使用 BIT 数据类型,它只允许 1 和 0。
【讨论】:
我建议您创建一个多对多关系,您可以实现以更合乎逻辑的方式(规范化)分隔列...对于上面的示例:
您应该有一个名为“schedules”的表(或任何对您有意义的表),另一个类似于“repeat_on”的表和第三个名为“days”的表(这里有周一至周日的 ID)。在中间的表(repeat_on)中,您应该创建外键(对于其他 2 个表:schedule_id 和 day_id)来发挥作用。
这样你可以任意组合,例如:
schedule day
1 1
1 3
1 7
意味着你必须在周一、周三和周日做同样的事情。
【讨论】:
这对于您的示例可能有些夸大其词,但您可能需要查看以下文章:
http://martinfowler.com/apsupp/recurring.pdf
我知道这是一个间接的答案,但读起来不会有什么坏处。
【讨论】:
像一周中的几天这样的事情很棘手。 PachinSV 和 Dustin Laine 都取得了不错的成绩。如果您有一个可供选择的事物列表,那么有一个代码表来列出事物和一个交集表来说明选择了哪些事物是一个很好的基本设计。
一周中的几天很棘手的原因是域(即日期列表)非常小,域永远不会扩展。此外,交叉表方法的优点之一是您可以针对周三发生的所有事情运行查询(例如)。当您的代码表类似于博客文章的类别标签时,这非常好,因为要求查看带有“How-To”标签的所有内容是一个合理的问题。对于一周中的几天重复的情况,告诉我周三重复的所有内容是否具有实际的商业意义?我不这么认为。您肯定会查询日期和日期范围,但一周中的几天,并且仅在重复的情况下?我想不出这样做的实际理由。
因此,有一个论点是一周中的日子是属性而不是独立的实体,所以在你的表上有 7 位标志仍然是 3NF。
【讨论】: