不需要在保存时进行复杂区分的可审核系统的设计

问题描述 投票:0回答:1

我们当前正在尝试为我们的系统设计一个simple模块,以使其可审核,但是我们不确定最佳策略是什么。我们希望尽早修复它,因为在应用程序上线之后,将所有数据迁移到其他策略可能会造成麻烦。

策略1 –我们当前的选择

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

策略2 –不太喜欢它

[我们想到的另一种策略是在每个表中都有两列,分别是valid_fromvalid_to时间戳。每次更新记录时,我们都会将valid_to填充到先前有效的记录中,并将当前记录保留为空值。我们将采用与前一种情况类似的提取策略。

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

所以我对大家的问题是,您是否使用了您引以为傲并愿意分享的其他审计策略?

design-patterns architecture audit
1个回答
0
投票

我建议您除了已经拥有的方法之外,还考虑其他方法:

审核结构

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

Revision字段应为递增计数器,它将使您的审核记录有序。如果您希望能够标识保存在同一事务中的一组对象,则还可以使其对于每个事务都是唯一的。

更新数据

每次更新可审核表中的记录-在相应的审核表中创建新记录。

获取数据

所有内容都与现在相同,因为您根本不需要更改原始表。

Hibernate Envers中使用了非常相似的方法。它使您可以独立于实际数据进行审核,可以将其删除,可以对其进行分区,可以对其进行分片,并且可以轻松禁用它以使您的应用程序像以前一样工作。

© www.soinside.com 2019 - 2024. All rights reserved.