首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用oracle的企业级数据库-规范化和复制

使用oracle的企业级数据库-规范化和复制
EN

Stack Overflow用户
提问于 2012-07-12 06:44:12
回答 2查看 234关注 0票数 0

我正在用Oracle后端开发企业应用程序。现在,我正在设计DB体系结构的核心部分,并对其提出了一些问题。

  1. 首先,也是最重要的一点是,我的大多数表都需要保存旧数据。例如

考虑一个有字段的表

合同编号,合同名称,合同人,合同电子邮件

我有这样的记录

12,xxx,yyy,xxx@zzz.ccc

有人把它修改成

12,xxx,zzz,xxx@zzz.ccc

在任何时候,我都需要显示新的记录,而仍然有旧记录的副本。

所以我想的是放一个旧数据的重复记录,更新被更改的字段,并有一个标志来跟踪活动记录,比如“是活动的”作为1。

缺点是,这会在表中产生冗余,而且似乎是一个糟糕的设计。但任何其他模式似乎不必要的复杂,这似乎比我更清洁。而且,我也没有看到任何性能问题有一个重复的记录。所以,请告诉我,如果这是好的,或我在这里遗漏了什么。

  1. 有时,在存在一对多关系的情况下,我的假设是有一个映射表,通过在每个记录中重复主ID和更改子ID来映射单个记录中的多个实体。这是一种正确的方法,还是有更好的方法去做。
  2. 有没有一本关于数据库最佳实践的书。

谢谢。

处理的数据库im是两个节点RAC集群上的Oracle 11g。

EN

回答 2

Stack Overflow用户

发布于 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的表会有不同的问题。

票数 1
EN

Stack Overflow用户

发布于 2012-07-12 11:13:40

我会把旧的/历史记录放在一张单独的桌子上。创建一个upd/del触发器来填充您的审计/历史表,并且只将最新的数据保存在主表中。

有关示例,请参见这里。在这方面也有许多类似的例子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11446300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档