如何在事件源架构中使用的事件存储中映射关系?

How do I map relations in an eventstore used in an eventsourced architecture?

我正在努力思考在事件存储中构建关系。我是事件采购方面的新手,所以请多多包涵。 :-)

应该如何在 eventstore 中映射关系?你能给我一些建议吗?

想象一下,我有一个关于项目管理的领域。我有一个 聚合 ,它是一个 ProjectProject 聚合根包含TasksDocumentsFilesFolders,它们是核心实体的集合Project。 我还有一个 ProjectBranch,它可以是 Project 聚合的一部分,但也可以独立查看。在 ProjectBranch 中可以更改前面提到的集合,并且可以将 ProjectBranch 再次合并到 Project 中,从而更新 Project 的集合。

部分流程类似于 VCS 系统。

应该如何映射这些关系以及我应该创建聚合和聚合根的哪个分离?

如果 Project 是唯一的聚合,事件(我想)如下所示:

一旦 ProjectBranchWasMergedToProject 事件发生,ProjectBranch 中发生的所有事件都必须以某种方式在项目上重播。

另一方面,可能会有一个关系更紧密的结构,其中有几个单独的聚合 - 例如ProjectProjectBranchTaskDocument 等。

这意味着该域有一组不同的事件,可能如下所示:

其中一些功能可能需要在 Project 之外独立工作,因此它们将作为独立模块制作。

谢谢 :-)

假设所有这些元素都是聚合:ProjectProjectBranchTaskDocument,等等。

构造Aggregates的基本原则之一是它们形成事务一致性边界,这意味着在单个Aggregate中,所有元素必须是一致的,并且在事务发生时满足关联的业务规则。

这就是为什么人们通常坚持使用小型聚合结构,大多数聚合中只有一个实体。随着 Project 的增长,您将不可能使所有这些元素保持同步和一致。

现在回答你的问题,关系的答案分为两部分:

  1. 聚合之间的所有链接都应采用聚合标识的形式。如果 Task 链接到 Project,则 Task 聚合事件将包含 ProjectId 作为属性。

    你不应该将聚合结构存储在另一个内部。

    如果您使用的是 RDBMS,则聚合之间所需的任何同步(例如,如果项目已关闭)都应在域事件的帮助下完成。

    但由于您使用的是 EventSourcing,因此不需要在后台执行此操作。你动态构造聚合结构,这就把我们带到了第二点。

  2. 与任何其他 EventSource 投影一样,当您构建聚合对象时,您将需要重构内部数据元素。

    如果您希望项目结构作为任务投影的一部分可用,请调用项目应用服务以实时检索项目聚合。

    对于您可能希望作为投影一部分的所有链接聚合,以此类推。