我是一名 J2EE 开发人员,我们正在使用带有 PostgreSQL 数据库的休眠映射。
我们必须跟踪数据库中发生的任何更改,换句话说,应该保存任何字段的所有先前和当前值。每个字段可以是任何类型(bytea、int、char...)
使用简单的表格很容易,但我们使用对象图则更加困难。
因此,从 UML 的角度讲,我们有一个对象图,该对象图随着每次更改和用户而存储在数据库中。
任何想法或模式如何做到这一点?
我是一名 J2EE 开发人员,我们正在使用带有 PostgreSQL 数据库的休眠映射。
我们必须跟踪数据库中发生的任何更改,换句话说,应该保存任何字段的所有先前和当前值。每个字段可以是任何类型(bytea、int、char...)
使用简单的表格很容易,但我们使用对象图则更加困难。
因此,从 UML 的角度讲,我们有一个对象图,该对象图随着每次更改和用户而存储在数据库中。
任何想法或模式如何做到这一点?
当前的 RDBMS 实现在处理时间数据方面不是很好。这就是为什么通过触发器维护单独的日志表是常用方法的原因之一。(另一个是审计跟踪经常与常规数据有不同的用例,将它们放在单独的表中可以更容易管理对它们的访问)。甲骨文在其Total Recall 产品中隐藏管道方面做得非常巧妙,但作为甲骨文,它为此收取 $$$。
Scott Bailey 发表了一篇关于 PostgreSQL 中时态数据的演讲。唉,它现在对您没有帮助,但似乎为 8.5 和 8.6 计划的一些功能将启用与时间相关的数据的透明存储。 了解更多。
一种常见的方法是存储对象的版本。
如果向要存储审计跟踪的每个表添加“版本”和“已删除”字段,则不要执行正常的更新和删除,请遵循以下规则:
如果遵循这种模式,每次更新时都会创建一条新记录,而不是覆盖旧数据,因此您将始终能够回溯并查看所有旧对象。
这对于对象图的工作方式完全相同,只需将新字段添加到对象图中的每个表,并如上所述处理每个表的每个插入/更新/删除。
如果您需要知道哪个用户进行了修改,您只需添加一个“ModifiedBy”字段即可。
(您可以在 DA 层代码中进行此处理,或者如果您愿意,可以使用数据库触发器来捕获更新/删除/检索调用并按照规则重新处理它们。)
显然,您需要考虑空间要求,因为每次更新都会产生一个全新的记录。如果您的应用程序更新繁重,您将生成大量数据。通常还包括“上次修改时间”字段,以便您可以离线处理数据库并删除比要求更旧的数据。