database - 时态数据库建模和规范化

标签 database database-design temporal-database

时态数据库的日期应该存储在一个表还是两个表中?如果这不违反规范化?

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

DATE1 和 DATE2 列表示 INFO1 和 INFO2 在 DATE1 和 DATE2 之间的时间段内为真。如果 DATE < TODAY,则事实已弃用,不应再在用户界面中显示,但不应出于历史目的删除它们。例如,INFO11 和 INFO21 现已弃用。

我应该拆分这张表吗?我应该在表中存储状态(已弃用还是当前)?

为了进一步澄清问题,已弃用是业务使用的术语,如果您更喜欢“不是当前”,则问题不是语义,也不是关于 sql 查询,我只想知道哪个设计违反或最好适合规范化规则(我知道规范化并不总是可行的方法,这也不是我的问题)。

最佳答案

“我想知道哪个设计违反了规范化规则”

取决于您要遵循的规范化规则集。

第一个也是最有可能违反范式的,在Date's book这违反了first NF , 是保存“当前”信息的行中的结束日期(对 future 日期信息的可能性进行抽象):如果您使该属性可为空,则违反了 1NF。

违反BCNF由于您选择的键,这显然可能会发生(因为在非时态数据库设计中也是如此 - 时态方面在这里没有区别)。关于“键的选择”:如果您使用单独的开始日期和结束日期(并且 SQL 让您别无选择),那么您很可能应该声明两个键:一个包含开始日期,一个包含结束日期。

另一个设计问题是多个数据列。这个问题在“时间数据和关系模型”中进行了相当大的讨论:如果 INFO1 和 INFO2 可以相互独立地改变,最好分解你的表以只包含一个属性,以避免“爆炸式增长” rows count”,否则,如果每次行中的一个属性发生更改时都必须创建一个新的完整行,则可能会发生这种情况。在这种情况下,您提供的设计违反了第六范式,正如(该范式)在“时间数据和关系模型”中定义的那样。

关于database - 时态数据库建模和规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514858/

相关文章:

php - 将记录插入主表;另一个表的外键列

sql - 从两列中选择非不同的行

mysql部分索引、反向索引

asp.net - 什么是 aspnet_Users 和 aspnet_Membership?我应该使用哪一个?有什么区别?

mysql - 使用 sqlalchemy 测量 mysql-server 上的插入时间和查询时间

sql-server-2016 - 使用 SQL Server 2016 时态表查询已删除记录的最佳方法是什么?

postgresql - 基于 PostgreSQL 中 10 分钟间隔的测量的时态数据库的平均聚合

java - 尝试从 SQL 数据库检索数据到 listview android 时收到空指针异常

sql-server - 将多个子表关联到一个父表

ms-access - 是否可以从 Access 更新 SQL Server 2016 时态表?