时态数据库的日期应该存储在一张还是两张表中?如果这不违反规范化?
PERSON1 DATE11 DATE21 INFO11 INFO21 DEPRECATED
PERSON2 DATE21 DATE22 INFO21 INFO22 CURRENT
PERSON1 DATE31 DATE32 INFO31 INFO32 CURRENT
DATE1 和 DATE2 列指示 INFO1 和 INFO2 在 DATE1 和 DATE2 之间的时间段内为 true。如果 DATE
我应该拆分这张桌子吗?我应该将状态(已弃用或当前)存储在表中吗?
为了进一步澄清问题,Deprecated是业务使用的术语,如果您更喜欢“不是当前的”,问题不是语义的,也不是关于sql查询的,我只是想知道哪种设计违反或最适合规范化规则(我知道标准化并不总是可行的方法,这也不是我的问题)。
“我想知道哪种设计违反了标准化规则”
取决于您想要遵循哪一组标准化规则。
第一个也是最有可能违反正常形式的,并且在日期书 https://www.goodreads.com/book/show/236664.An_Introduction_to_Database_Systems这是违反first NF https://en.wikipedia.org/wiki/First_normal_form,是包含“当前”信息的行中的结束日期(对未来日期信息的可能性进行抽象):如果将该属性设置为可为空,则违反了 1NF。
违反BCNF https://en.wikipedia.org/wiki/Boyce%E2%80%93Codd_normal_form显然,这可能是您选择键的结果(因为在非时间数据库设计中也是如此 - 时间方面在这里没有区别)。关于“键的选择”:如果您使用单独的开始日期和结束日期(并且 SQL 类型让您别无选择),那么很可能您应该声明两个键:一个包含开始日期,另一个包含结束日期。
另一个设计问题是多个数据列。这个问题在“时态数据和关系模型”中进行了详细讨论:如果 INFO1 和 INFO2 可以彼此独立地更改,那么最好分解表以仅保存一个属性,以避免“爆炸”如果每次行中的一个属性发生更改时都必须创建一个新的完整行,则可能会出现“行计数”问题。在这种情况下,您给出的设计违反了第六范式,如“时态数据和关系模型”中定义的(该范式)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)