如何为聚合根创建审计跟踪?

最后发布: 2011-05-14 03:14:47


问题

我已经在线阅读了几篇文章,以及有关为数据库驱动的应用程序创建审核跟踪的StackOverflow的一些答案。 似乎最流行的解决方案是为有问题的表创建审计表,并使用触发器将审计记录插入到审计表中。

我可以看到这对于数据包含在一个表中的简单实体将如何有效地工作。

包含子项的聚合根呢?

例:

订单是一个聚合根,包含许多订单行,每个订单行在数据库中都有自己的表。 假设每个数据库中都有一个审计表,当原始表更改时,该审计表通过触发器接收更新:

tblOrders --> Trigger --> tblOrdersAudit
tblOrderLines --> Trigger --> tblOrderLinesAudit

现在,假设我们对某个订单进行了一些更改,但未对其任何订单行进行任何更改。 结果将更新tblOrders,触发器将插入一个新的审计记录,以反映对tblOrdersAudit所做的更改。 但是,没有对tblOrderLines进行任何更改,因此tblOrderLinesAudit中没有匹配的审核记录。

稍后,我需要查看Order的较早状态,也许是回滚数据。 我们如何匹配审核记录?

database-design domain-driven-design audit-trail
回答

如果回滚,您是否会按表进行操作? 假设自从T-1更新tblOrders以来,对数据库所做的任何更改。 在这种情况下

  1. tblOrders将回滚到时间T-1:审计值将用于将tblOrders恢复到T-1的状态。

  2. tblOrdersLines将回滚到时间T-1: tblOrdersLineAudit没有条目,因此不会更新任何内容。

最后,您的表处于T-1状态。

很少有更多信息的链接-


回答

稍后,我需要查看Order的较早状态,也许是回滚数据。 我们如何匹配审核记录?

正如您正确识别的那样,这并不容易。

就个人而言,当我需要重新访问快照时,我会存储整个聚合的副本。 换句话说,在对订单或订单行或任何其他关联表的插入/更新/删除上,我记录了该订单+每个订单行+其他关联表中的每个相关行。

从存储的角度来看效率不高(即使我倾向于存储每个事务的最终快照,而不是每次更改),从性能的角度来看也不理想,但是可以完成工作……