2

我是一名 J2EE 开发人员,我们正在使用带有 PostgreSQL 数据库的休眠映射。

我们必须跟踪数据库中发生的任何更改,换句话说,应该保存任何字段的所有先前和当前值。每个字段可以是任何类型(bytea、int、char...)

使用简单的表格很容易,但我们使用对象图则更加困难。

因此,从 UML 的角度讲,我们有一个对象图,该对象图随着每次更改和用户而存储在数据库中。

任何想法或模式如何做到这一点?

4

2 回答 2

1

当前的 RDBMS 实现在处理时间数据方面不是很好。这就是为什么通过触发器维护单独的日志表是常用方法的原因之一。(另一个是审计跟踪经常与常规数据有不同的用例,将它们放在单独的表中可以更容易管理对它们的访问)。甲骨文在其Total Recall 产品中隐藏管道方面做得非常巧妙,但作为甲骨文,它为此收取 $$$。

Scott Bailey 发表了一篇关于 PostgreSQL 中时态数据的演讲。唉,它现在对您没有帮助,但似乎为 8.5 和 8.6 计划的一些功能将启用与时间相关的数据的透明存储。 了解更多

于 2010-03-28T04:19:59.193 回答
1

一种常见的方法是存储对象的版本。

如果向要存储审计跟踪的每个表添加“版本”和“已删除”字段,则不要执行正常的更新和删除,请遵循以下规则:

  • 插入 - 将版本号设置为 0 并正常插入。
  • 更新 - 增加版本号并进行插入。
  • 删除 - 增加版本号,将已删除字段设置为 true 并执行插入操作。
  • 检索 - 获取版本号最高的记录并返回。

如果遵循这种模式,每次更新时都会创建一条新记录,而不是覆盖旧数据,因此您将始终能够回溯并查看所有旧对象。

这对于对象图的工作方式完全相同,只需将新字段添加到对象图中的每个表,并如上所述处理每个表的每个插入/更新/删除。

如果您需要知道哪个用户进行了修改,您只需添加一个“ModifiedBy”字段即可。

(您可以在 DA 层代码中进行此处理,或者如果您愿意,可以使用数据库触发器来捕获更新/删除/检索调用并按照规则重新处理它们。)

显然,您需要考虑空间要求,因为每次更新都会产生一个全新的记录。如果您的应用程序更新繁重,您将生成大量数据。通常还包括“上次修改时间”字段,以便您可以离线处理数据库并删除比要求更旧的数据。

于 2010-03-27T20:11:44.100 回答