具有 2 个日期和持续时间的 SQL 规范化都在一列中



我是SQL的初学者。

在SQL表的第一种正常形式(1NF(中,一个值不应重复值,列应具有原子值。

我有一个我有列的表 startDate | endDate |持续时间

startDate具有01/01/2000和EndDate 03/03/2003的值,因此使用相同的两个值在Startdate和Enddate中使用相同的两个值字段。

我是否完全摆脱了持续列,并假设一个人能够找到具有查询的信息,或者有没有办法将其归一化以遵循规则而不会丢失任何数据?

我在3NF点中注意到了这个问题,当我将这3列与另一个信息与另一个信息分开时,但是我认为这应该在此之前做到吗?

如果startdate和enddate只是持续时间的日期,那么它在功能上决定了它们,并且两个人一起确定了它们。因此,标准化(保存FD(功能依赖性((到足够高的正常形式将使您将其中的三个分为一个单独的表。

,但显然,将{持续时间}或{startdate,endDate}作为列的子集就足够了。如果添加另一个属性,则是多余的。归一化无济于事,因为它仅消除了可以通过加入的投影代替表的冗余。

一般而言,最好存储间隔终点。关系设计中的一般思想是要为您可能想单独查询的某些部分的任何部分都有一列。如果要控制这种冗余,了解计算/计算的列。

ps 1请参阅此答案恢复"原子"。

ps 2.归一化不是不是通过将正常形式移动到最高想要的方法来完成。(应该是5NF,然后出于某些原因可以不正当。标准化到较低的正常形式可以排除良好的高级设计中的良好的高级设计。找到用于标准化为3NF或BCNF的算法。

我必须承认,我从不关心标准化表格,因为为了避免数据库中的冗余和不一致,您可以自动应用它们而无需思考1NF,2NF等。<<<<<</p>

使用您当前的表设计(3列:StartDate,endDate,持续时间,也许还有其他(1NF,因为您既不能拆分起点,也不能将终点拆分,也不能分为有意义的部分。

2NF是关于主键,如果我没记错的话。我想,3NF是我们对给定的桌子设计违反的。这是因为,如果我们有两个具有相同起点的记录和终结的记录,它们的持续时间相同,因此该字段并不依赖于某些主要键。起步和终点也可以这样说。因此,三列因此可以删除一个列以满足3NF要求。您可以自由选择。

我不熟悉您域中的业务规则和要求,但是,例如,如果我们知道持续时间始终相同 - 我们可以删除端代的字段,或者在拳击中回合(总是3分钟( - 我们可以删除终点和持续时间!但是,如果您的项目高负载,并且性能非常重要您 - 您可能会考虑一个微优化的选项,并具有所有3个字段,只是为了赢得一些微型时间。

我的意思 - 没有人能够说表中有所有3个字段(startDate,端代或持续时间(,这是不良方法。

最新更新