【问题标题】:How do you create an audit trail for aggregate roots?如何为聚合根创建审计跟踪?
【发布时间】:2011-08-25 08:51:16
【问题描述】:

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

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

包含子节点的聚合根呢?

例子:

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

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

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

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

【问题讨论】:

  • 我不确定我是否理解。这似乎按预期工作。 tblOrderLines 不应该有审计记录,因为没有任何改变,对吧?您是否出于某种原因想要tblOrderLines 的审核记录?它会说什么?
  • 我解释得不够好。如果我需要返回某个时间点并查看订单的快照,我需要相应的订单行来配合它。我为一个订单加载了审计记录...我如何判断哪个 OrderLine 审计记录与之一起使用,以便整个聚合的状态有效?
  • 好的,我明白你在说什么。查看@YetAnotherUser 的答案以获得答案。基本上,您是回滚到某个时间点,而不是尝试将存档表相互链接。
  • @BiggsTRC 阅读我对他关于不知道 T-1 的评论。我可能解释得不够好,但我真正想要的是能够重新创建聚合自创建以来一直处于的每个状态。这将使我能够看到问题的根源,并可能修复数据。希望这是有道理的,我真的不应该在整天绞尽脑汁之后这么晚才发布问题:)

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


【解决方案1】:

在回滚的情况下,您不会按表执行吗? 假设从 T-1 更新 tblOrders 以来,对数据库所做的唯一更改。在这种情况下

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

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

最后,您的桌子处于 T-1 时的状态。

更多信息的链接-

【讨论】:

  • 我同意这一点,但如果我不知道 T-1 时间怎么办?例如,我知道订单有问题(用户输入了错误数据等)。我需要查看聚合经历的状态更改列表,以便查看问题发生在哪里。我可以重新创建聚合的每个状态,因为它是从两个审计表创建的吗?抱歉,如果这没有意义,很难准确解释我的想法。
  • @Casey :是的,您应该能够重新创建每个状态。请记住,在您的场景中,您将使用审计表来重新创建主表,但要查看特定时间的数据,您将查看主表。
  • @Casey :我假设您将在主表和审计表中都有时间戳,以便将它们放在一个时间线上。如果您尝试在 excel 中创建一个场景并查看数据如何变化以及不同表的视图是什么,这可能会有所帮助。它会澄清你的很多疑问。
【解决方案2】:

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

正如您正确指出的那样,这并不容易。

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

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

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 1970-01-01
    • 2020-01-01
    • 2018-10-23
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2021-06-22
    • 2013-08-13
    相关资源
    最近更新 更多