事件采购。与 Children 列表或 ParentID 聚合?

Event Sourcing. Aggregates with Children lists or with ParentID?

我应该存储在 children 的聚合列表中还是只存储 ParentID?

children 的列表可能很大(数千)。添加或删除一个 child 将意味着在仅添加或删除一个时节省数千 children 的存储空间。 ParentID 非常容易管理。它使所有聚合变得简单(没有列表!)。它允许通过简单地按 ParentID 查询聚合来快速创建列表。它允许任意级别的层次结构,可以递归地快速重建而不创建巨大的聚合。 如果我使用 ParentID,我是否应该将字段 ParentIdGuid 添加到事件 table 以引用聚合的 parent,以便我可以快速生成列表?

编辑:

Brad 的回答让我意识到 parentid 不会包含在更新的 child objects 的结果 json 中,因为我只会包含已更改的字段。因此我不能依赖 postgress 的 json 索引。这意味着我必须在事件 table 本身上创建一个 parentid 列。

child 上的 parent ID 绝对是正确的选择。想想数据库外键。该关系在 child 记录中作为 parent ID 指针保存。

当您在内存中实例化您的 AR 以使用它时,您应该使用 ParentID 指针填充 children 的列表。如果这很昂贵(听起来确实如此),也许您可​​以实现一个 populate-on-demand 功能,这样除非有必要,否则您不必支付价格。

事件有 2 种方法 table。它要么包含更改后实体的所有属性,要么只包含修改后的字段。如果您支持保存所有属性,那么 ParentID 应该在每个事件中。如果您更愿意只保存更改,那么该实体的事件列表中的某处应该是 ParentID;可能只是在创建事件中。使用事件溯源,您可以将所有更改事件相加以达到当前状态,因此这将为您提供实体中的 ParentID。