不需要复杂差异保存的可审核系统的设计

Design of an auditable system which doesn't require complex diffing on save

我们目前正在尝试为我们的系统设计一个简单模块,以使其成为 auditable,但我们不确定什么是最好的策略岛我们想尽早尝试并确定它,因为在应用程序上线后,将所有数据迁移到不同的策略可能是一个 kerkuffle。

策略 1 – 我们当前的选择

我们目前正在试验的系统包括在每次进行更新时创建一条新记录,并且在查询时,只需获取具有最新 created_on 时间戳的记录。如果我们有父子关系并且要更新子项,我们将只更新子项,而不是父项。在查询这些时,我们会对每个依赖关系应用相同的策略。

策略 2 – 不太喜欢

我们想到的另一种策略是在每个 table 中有两列,一个 valid_from 和一个 valid_to 时间戳。每次我们更新记录时,我们都会将 valid_to 填充到先前有效的记录中,并将当前记录保留为空值。我们将遵循与前一个案例类似的抓取策略。

最后,我想强调的是,我们不坚持使用 策略 1 的主要原因是因为为了保存数据,要求我们经历一个我们不喜欢的相当复杂的差异化过程。每次前端用新的有效负载调用我们的 API 时,我们都会获取最新的聚合(父级 + 子级 + 孙级等),进行完整的比较并确定要更新的内容。

所以我想问你们的问题是,你们是否使用过任何其他引以为豪并愿意分享的审计策略?

我建议你考虑下一个方法,除了你已经有的方法:

审计结构

对于您要审计的每个 table,为审计记录创建另一个审计记录,其中包含您要审计的字段加上字段 revision(以及您想要的任何其他字段)。例如,如果您有 table“Order”,则创建“Order_aud”。

Revision字段应该是递增计数器,它会让你的审计记录有序。如果您希望能够识别保存在同一事务中的一组对象,您也可以使其对于每个事务都是唯一的。

正在更新数据

每次在 auditable 中更新记录时 table - 只需在相应的审计 table 中使用相同的数据创建新记录。

正在获取数据

一切都会和现在一样,因为你根本没有改变原点 tables。

Hibernate Envers 中使用了非常相似的方法。它可以让你独立于实际数据处理你的审计,你可以删除它,你可以分区它,你可以分片它,你可以存档它,你可以轻松地禁用它以使你的应用程序像以前一样工作。