0

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

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

考虑一个包含字段的表

合同编号、合同名称、合同人员、合同邮箱

我有类似的记录

12, xxx, yyy, xxx@zzz.ccc

有人将其修改为

12, xxx, zzz, xxx@zzz.ccc

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

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

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

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

  2. 有没有关于数据库最佳实践的书。

谢谢。

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

4

2 回答 2

1

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

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

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

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

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

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

有没有关于数据库最佳实践的书。

有关于时间数据库的书籍。我知道的第一个是 Snodgrass 的Developing Time-Oriented Database Applications in SQL。它有多种格式,而且是免费的。它也有点老了,但其中的信息对于了解您是否要构建时态数据库很重要。另外,考虑阅读 Date 的书Temporal Data and the Relational Model

维基百科有一篇文章总结了时态数据库背后的思想

标准化是完全强制性的。

这是一个没有意义的问题。标准化为 2NF 的表格与标准化为 5NF 或 6NF 的表格会有不同的问题。

于 2012-07-12T10:33:05.963 回答
1

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

有关示例,请参见此处。SO中还有许多其他类似的例子。

于 2012-07-12T11:13:40.073 回答