【问题标题】:6NF and historical attribute data6NF和历史属性数据
【发布时间】:2012-02-02 03:53:24
【问题描述】:

当使用根据 6NF 原则规范化的数据库时,您将如何存储历史属性数据?

假设我们从@PerformanceDBA 获取this example,但有以下额外要求:

我们需要存储我们所有产品的历史数据,我们应该 只需输入日期并获取属性的快照 那个特定时间的产品。

一个更实际的例子
假设上例中的磁盘和 CPU 是虚拟的,用户可以随意更改磁盘容量。我们如何更改数据库,以便我们可以在过去的任何时间(当然是在创建日期之后)检索给定磁盘的属性,同时保持 5NF 视图足够快。

我正在考虑的事情

  • 为每个属性表添加一个时间戳列“changedate”(这将导致一个非常复杂的查询,其中包含每个属性表的子查询和连接
  • 为每个属性表创建一个单独的 *history 表(可能会导致大量的表,因为我们有大约 70 个属性分布在 20 种产品类型中
  • 另外:为每个属性表添加一个索引'current'列,以加快5NF视图

感谢任何帮助!


编辑:我知道时态数据库的概念,但问题是对于我正在使用的数据库引擎(postgresql),时态扩展还没有完全实现。关于如何在没有时间数据库的情况下实现这一目标的任何建议?

【问题讨论】:

  • 只是为了警告你——我走上了没有历史表的道路,并在我的“实体”的每一行上使用了“从”和“到”日期。这是我犯的最大错误,它把项目变成了一场噩梦。在您提到的人 PerformanceDBA 的指导下,让我真正理解了数据库的真正含义(即不仅仅是对象的存储桶)。从那以后,我使用更传统的方法(历史表/视图)重写了项目,并且在各个方面都更好。好的,没有太多的争论,但要详细说明需要大量的文档。
  • 这篇文章让我开始改变我对数据库的总体看法(从软件工程师的角度到 DBA 的角度):- stackoverflow.com/questions/4491173/… - 我是并不是说按照建议去做是错误的(使用“from”和“to”,没有历史表),但对我来说,这造成了很大的混乱,我再也不会走那条路了。

标签: database database-design relational-database database-normalization


【解决方案1】:

最近批准的 SQL:2011 标准包含的功能使您能够比以往更好地处理此类问题。

并不是说你可以在时间领域做任何你想做的事情,但引入的确实是一个相当显着的改进。

http://metadata-standards.org/Document-library/Documents-by-number/WG2-N1501-N1550/WG2_N1536_koa046-Temporal-features-in-SQL-standard.pdf 有一个很好的介绍。

请注意,只有一家供应商在其 SQL 产品中对这些功能提供合理支持,另一家可能正在开发中,第三家已为其客户开放投票渠道。

www.linkedin.com 上还有一个“时间数据”讨论组,专门针对您手头的主题。

编辑试图解决“关于如何在没有时间数据库的情况下实现这一点的任何建议?”

不要在模型中只添加一个日期/时间类型列。第一个原因和你说的一样,第二个原因是这个解决方案也是新标准推动的解决方案,一旦新功能可用,它将有助于过渡到支持新功能的引擎。

所以添加一个开始和结束日期/时间列。不要使它们中的任何一个都可以为空。新标准因其时间特征而要求这样做。如果 end-MIT (moment-in-time) 仍然未知,请使用适用时间类型的最大值,例如9999-12-31。

您不需要“为每个属性创建单独的历史记录表”。同样可能有一个“单个实体表”来保存“整个实体发生的历史”。缺点是很难查询某个特定属性何时发生 ACTUAL 更改(因为您会为任何属性的任何更改获取新的历史行,可能会复制相同的属性值大多数的属性)。 “单表”可能是空间的热切消费者,“每个属性的单独历史记录”可能是查询 CPU 时间的热切消费者。这将是一种平衡行为,而具体的平衡点取决于您的具体情况。

不要在您的表中“添加索引的‘当前’列”。首先,当您的引擎拥有新功能时,它们不会帮助您过渡到新功能,其次,Y/N 列是非常糟糕的鉴别器,因此索引的候选者非常差。我宁愿将你的 start-mit 或 end-mit 添加到索引中,只要你需要查询那些.

至于数据库约束的实施,例如时间键中时间段的不重叠以及时间 RI 中时间段的包含,您完全靠自己。在触发器或 SPROC 或应用程序代码中编写您需要的代码,按优先级降序排列。

这更有帮助吗?

【讨论】:

猜你喜欢
  • 2018-12-17
  • 2015-10-26
  • 1970-01-01
  • 2018-04-09
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
相关资源
最近更新 更多