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

时间:2011-05-14 03:14:47

标签: database-design domain-driven-design audit-trail

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

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

包含儿童的聚集根源怎么样?

示例:

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

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

现在,假设我们对订单进行了更改,但不对其任何订单行进行任何更改。结果会更新tblOrders,并且触发器会插入反映tblOrdersAudit更改的新审核记录。但是,没有对tblOrderLines进行任何更改,因此tblOrderLinesAudit中没有匹配的审计记录。

一段时间后,我需要查看Order的早期状态,或许是为了回滚数据。我们如何匹配审计记录?

2 个答案:

答案 0 :(得分:1)

如果回滚,您不会按表格进行吗? 假设只有对数据库进行了更改,因为时间T-1是tblOrders的更新。在这种情况下

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

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

  3. 最后,你的桌子处于他们在T-1的状态。

    更多信息的链接很少 -

答案 1 :(得分:0)

  

一段时间后,我需要查看Order的早期状态,或许是为了回滚数据。我们如何匹配审计记录?

正确识别并不容易。

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

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