【发布时间】: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