应日期的一个时空数据库存储在一个或2个表?如果不这违反正常化?

PERSON1 DATE11 DATE21 INFO11 INFO21 DEPRECATED
PERSON2 DATE21 DATE22 INFO21 INFO22 CURRENT
PERSON1 DATE31 DATE32 INFO31 INFO32 CURRENT

DATE1和DATE2列表明,INFO1和INFO2是真实的期间之间的DATE1和DATE2.如果日期 < 今天,事实是已过时,不应该显示出任何更多的用户界面,但他们不应该被删除历史的目的。例如INFO11和INFO21现在已经过时了。

我应该分割这种表?我应该储存的状态的(废弃或流)在表?

为澄清这个问题更进一步,弃用的术语使用的业务,如果你喜欢"不前",问题不是语义,它不是关于sql查询,无论是,我只是想知道这设计违反或最适合正常化的规定(我知道正常化不是永远的路要走,这不是我的问题或者)。

有帮助吗?

解决方案

"我想知道这设计违反了正常化的规则"

取决于其设定的规范化规则的你要去通过。

第一和最有可能违反了通常的形式,并在 日的书 这是违反 第一NF, 是你的最终日期,在行持有"当前"信息的(作出抽象的可能性的未来日期的信息):你违反了1NF如果你作出这样的属性,可以为null.

侵犯 BCNF 显然可以发生是因为你选择的钥匙(因为它是这种情况在nontemporal数据库的设计太-时间方面没有差别)。考"选择的钥匙":如果使用独立的开始和结束日期(和SQL样的叶子您没有其他选择),则最有可能你应该宣布两项:一个包括开始日期,和一个包括结束日期。

另一种设计问题是多个数据列。这个问题的讨论相当大,在"时间数据和关系模型":如果INFO1和INFO2可以改变自独立的另一个,它可能是更好的解你的表举行只是一个属性,为了避免"爆炸的行计",否则可能发生如果你必须创建一个新的完整的行每次一个属性的行中的改变。在这种情况下,你的设计你给了它构成了违反第六正常的形式,因为(正常的形式)中定义的"时间数据和关系模型"。

其他提示

规范化是关系数据库概念 - 它不同样适用于时间的数据库。这并不是说你不能域数据存储在关系数据库中。你绝对可以。

但是,如果你与时态数据库设计去,然后颞标准化的概念应用而不是关系正常化。

您还没有所示日期的含义。它们是指(一)期间,当说其实在现实生活中是真实的,或(b)的时期时所陈述的事实被的认为是真正的由数据库的持有者?如果(B),然后我绝不会做这种方式。移动更新行存档表/登录立即当更新完成。如果(a),则下面的语句是有问题的:

“的事实被弃用,不应该显示在用户界面中的任何更多的”

如果一个事实不“需要在用户界面中显示了”了,那么它不需要在数据库中了任一。保持这样的事实存在实现的只有一件事:一般的恶化表现为所有的休息

如果你真的需要其实这些历史陈述,以满足您的需求,那么有可能你所谓的“过时的事实”仍然非常相关的业务,因此没有“过时”的说法。 Assumming,为了这个原因,也有你的数据库非常小“真正过时”的事实,你的设计是好的。只要保持的“真正弃用事实”的数目小通过周期性地从业务数据库中删除它们。

(PS)说,你的设计是好的,并不意味着你不会遇到任何问题。 SQL是非常不适合于很好地处理这类信息。 “时态数据和关系模型”是被检体的优异的治疗。另一本书,从斯诺德格拉斯的一个,经常称赞过,但不是我。这一个是食谱的食谱东西处理在SQL这些问题,作为SO这本书证明由下面的对话:

(Q) “为什么我会读了吗?” (A)“因为你要求的触发是135页上。”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top