我正在用Oracle后端开发企业应用程序。现在,我正在设计DB体系结构的核心部分,并对其提出了一些问题。
考虑一个有字段的表
合同编号,合同名称,合同人,合同电子邮件
我有这样的记录
12,xxx,yyy,xxx@zzz.ccc
有人把它修改成
12,xxx,zzz,xxx@zzz.ccc
在任何时候,我都需要显示新的记录,而仍然有旧记录的副本。
所以我想的是放一个旧数据的重复记录,更新被更改的字段,并有一个标志来跟踪活动记录,比如“是活动的”作为1。
缺点是,这会在表中产生冗余,而且似乎是一个糟糕的设计。但任何其他模式似乎不必要的复杂,这似乎比我更清洁。而且,我也没有看到任何性能问题有一个重复的记录。所以,请告诉我,如果这是好的,或我在这里遗漏了什么。
谢谢。
处理的数据库im是两个节点RAC集群上的Oracle 11g。
发布于 2012-07-12 10:33:05
而且,我也没有看到任何性能问题有一个重复的记录。
假设您有一个行,随着时间的推移,它有15个更新。如果不存储任何时态数据(如果不存储不同版本的行),则最终存储一行。如果存储时态数据,则最终存储15行。
您还需要更多的索引,因为id号已不足以识别单个行。
如果您只有相对较小的表,您可能不会看到任何性能差异。(会有一个,但用户可能不会注意到。)但是,一个有1000万行的表将与有1.5亿行的表执行不同的操作。(每行15个版本,乘以1000万行)
有时,在存在一对多关系的情况下,我的假设是有一个映射表,通过在每个记录中重复主ID和更改子ID来映射单个记录中的多个实体。这是一种正确的方法,还是有更好的方法去做。
您可能需要知道哪些子行属于哪个父行。所以你需要一个以上的主id作为钥匙。仅使用主id并不能告诉您父表中该行的哪个版本适用于给定的子行。
有没有一本关于数据库最佳实践的书。
有关于时态数据库的书籍。我知道的第一个例子是斯诺德格拉斯的http://www.cs.arizona.edu/~rts/publications.html。它有多种格式,而且是免费的。这也有点老了,但是如果要构建一个时态数据库,了解其中的信息是很重要的。此外,考虑阅读日期的书籍时态数据和关系模型。
维基百科有一篇总结时态数据库背后的思想的文章。
是完全强制性的。
这是个毫无意义的问题。与标准化为5NF或6NF的表不同,使用2NF的表会有不同的问题。
发布于 2012-07-12 11:13:40
我会把旧的/历史记录放在一张单独的桌子上。创建一个upd/del触发器来填充您的审计/历史表,并且只将最新的数据保存在主表中。
有关示例,请参见这里。在这方面也有许多类似的例子。
https://stackoverflow.com/questions/11446300
复制相似问题