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