如何在数据库中存储一个或多个复选框值?

时间:2011-04-25 20:57:31

标签: database database-design

正如这个问题肯定会揭示,我对数据库设计相对较新。请原谅我缺乏理解。

我想在数据库中存储以下值(来自Google日历的示例):

Google Calendar repeating events

最好的方法是什么?这是一个数据库字段还是几个?

如果是前者,这是否违反了规范化规则?

谢谢!

5 个答案:

答案 0 :(得分:1)

我建议你创建一个多关系,你可以实现以更合理的方式分离列(规范化)......对于上面的例子:

你应该有一个名为“scheduleles”的表(或任何对你有意义的表),另一个叫“repeat_on”的表和第三个名为“days”的表(这里你有星期日 - 星期日及其ID)。在中间的表格(repeat_on)中,你应该创建外键(对于其他2个表:schedule_id和day_id)来做魔术。

通过这种方式,您可以组合您想要的任何内容,例如:

schedule    day
 1           1
 1           3
 1           7

意思是你必须在周一,周三和周日这样做。

答案 1 :(得分:0)

IMO,规范化是一门艺术。但是,我通常会把你喜欢的字段放在一个表中,因为我们永远不会超过7天。但是,如果有任何增长机会,我会把它放在一个单独的表格中。

答案 2 :(得分:0)

如果选项是互斥的,那么您可以使用一个字段来存储选项。理想情况下,为字段设置约束,以便只存储允许的值。

如果可以选择多个选项,则每个选项应该有一个字段,值为'y'和'n'(或't'/'f'表示true / false)。同样,您应该添加一个约束以仅允许这些值。如果DBMS支持它,请使用BIT数据类型,该数据类型仅允许1和0。

答案 3 :(得分:0)

对于您的示例,这可能过于夸张,但您可能需要查看以下文章:

http://martinfowler.com/apsupp/recurring.pdf

我知道这是一个间接的答案,但读起来不会有害。

答案 4 :(得分:0)

像星期几这样的事情很棘手。 PachinSV和Dustin Laine都提出了很好的观点。如果你有一个可供选择的东西列表,有一个列出事物的代码表和一个交叉表来说明选择哪些是一个很好的基本设计。

本周日子很棘手的原因是域名(即天数列表)非常小,域名无法扩展。此外,交集表方法的一个优点是,您可以针对星期三发生的所有事情运行查询(例如)。当您的代码表类似于博客文章的类别标签时,这很好,因为要求查看带有“操作方法”标签的所有内容是一个合理的问题。对于一周中几天复发的情况,是否有任何实际的商业意义来说明每周三重现的事情?我不这么认为。您肯定会查询日期和日期范围,但是查询一周中的几天,并且仅在重复的情况下查询?我无法想到这样做的实际理由。

因此,有一种观点认为,星期几是属性而不是独立实体,所以在你的桌子上有七位标志仍然是3NF。