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

时间:2012-07-12 06:44:13

标签: oracle oracle11g duplicates normalization

我正在使用Oracle后端开发企业应用程序。我现在正在设计数据库架构的核心部分,我对此有一些疑问。

  1. 首先也是最重要的是,我的大多数表需要保留旧数据。例如
  2. 考虑一个包含字段

    的表

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

    我有像

    这样的记录

    12,xxx,yyy,xxx @ zzz.ccc

    并且有人将其修改为

    12,xxx,zzz,xxx @ zz.ccc

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

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

    缺点是这会在表格中产生冗余,看起来像是一个糟糕的设计。但任何其他模型似乎都不必要地复杂,这对我来说似乎更清晰。此外,我也没有看到任何重复记录的性能问题。所以,请告诉我这是否正常,或者我在这里遗漏了什么。

    1. 有些时候存在一对多的关系,我的假设是有一个映射表,我通过重复主ID和更改每个记录中的子ID来映射单个记录中的多个实体。这是一种正确的方法,还是有更好的方法。

    2. 是否有关于数据库最佳实践的书籍。

    3. 感谢。

      我正在处理的数据库是双节点RAC集群上的Oracle 11g

2 个答案:

答案 0 :(得分:1)

  

此外,我也没有看到任何有重复记录的性能问题。

假设您有一行,随着时间的推移,它有15个更新。如果您不存储任何时态数据(如果您不存储该行的不同版本),则最终存储一行。如果存储时态数据,则最终存储15行。

您还需要更多索引,因为ID号不再足以识别单行。

如果您只有相对较小的表,您可能不会看到任何性能差异。 (成为一个,但它可能不会被用户注意到。)但是,具有1000万行的表将与具有1.5亿行的表执行不同。 (每行15个版本,乘以1000万行。)

  

有时我的假设是一对多的关系   有一个映射表,我在其中映射个人的多个实体   通过重复主ID和更改每个记录中的子ID来记录。   这是一种正确的方法,还是有更好的方法。

您可能需要知道哪些子行属于哪些父行。因此,您需要多个密钥的主ID。仅使用master id不会告诉您父表中该行的哪个版本适用于给定的子行。

  

是否有关于数据库最佳实践的书籍。

有关于时态数据库的书籍。我所知道的第一个是斯诺德格拉斯的Developing Time-Oriented Database Applications in SQL。它有多种格式,而且是免费的。它也有点旧,但是如果你要构建一个时态数据库,其中的信息很重要。另外,考虑阅读Date的书时态数据和关系模型

维基百科有一篇文章总结了ideas behind temporal databases

  

规范化是否完全是强制性的。

这是一个毫无意义的问题。对于标准化为2NF的表,您将遇到的问题与使用标准化为5NF或6NF的表的情况不同。

答案 1 :(得分:1)

我会将旧/历史记录保存在单独的表中。创建一个upd / del触发器,为您填充审计/历史记录表,并仅保留主表中最新的数据。

有关示例,请参阅here。 SO中存在许多其他类似的例子。