如何在事件源架构中使用的事件存储中映射关系?
How do I map relations in an eventstore used in an eventsourced architecture?
我正在努力思考在事件存储中构建关系。我是事件采购方面的新手,所以请多多包涵。 :-)
应该如何在 eventstore 中映射关系?你能给我一些建议吗?
想象一下,我有一个关于项目管理的领域。我有一个 聚合 ,它是一个 Project
。 Project
聚合根包含Tasks
、Documents
、Files
、Folders
,它们是核心实体的集合Project
。
我还有一个 ProjectBranch
,它可以是 Project
聚合的一部分,但也可以独立查看。在 ProjectBranch
中可以更改前面提到的集合,并且可以将 ProjectBranch
再次合并到 Project
中,从而更新 Project
的集合。
部分流程类似于 VCS 系统。
应该如何映射这些关系以及我应该创建聚合和聚合根的哪个分离?
如果 Project
是唯一的聚合,事件(我想)如下所示:
- ProjectWasCreated [聚合]
- ProjectDocumentWasCreated
- ProjectTaskWasCreated
- ProjectBranchWasCreated
- ProjectBranchDocumentWasCreated
(这个事件如何知道文档属于哪个分支)
一旦 ProjectBranchWasMergedToProject 事件发生,ProjectBranch
中发生的所有事件都必须以某种方式在项目上重播。
另一方面,可能会有一个关系更紧密的结构,其中有几个单独的聚合 - 例如Project
、ProjectBranch
、Task
、Document
等。
这意味着该域有一组不同的事件,可能如下所示:
- ProjectWasCreated [聚合]
- DocumentWasCreated [聚合]
- ProjectDocumentWasAttached(documentId)
- ProjectBranchWasCreated(projectId) [聚合]
- DocumentWasCreated [聚合]
- ProjectBranchDocumentWasAttached(documentId)
其中一些功能可能需要在 Project
之外独立工作,因此它们将作为独立模块制作。
谢谢 :-)
假设所有这些元素都是聚合:Project
、ProjectBranch
、Task
、Document
,等等。
构造Aggregates的基本原则之一是它们形成事务一致性边界,这意味着在单个Aggregate中,所有元素必须是一致的,并且在事务发生时满足关联的业务规则。
这就是为什么人们通常坚持使用小型聚合结构,大多数聚合中只有一个实体。随着 Project
的增长,您将不可能使所有这些元素保持同步和一致。
现在回答你的问题,关系的答案分为两部分:
聚合之间的所有链接都应采用聚合标识的形式。如果 Task
链接到 Project
,则 Task
聚合事件将包含 ProjectId
作为属性。
你不应该将聚合结构存储在另一个内部。
如果您使用的是 RDBMS,则聚合之间所需的任何同步(例如,如果项目已关闭)都应在域事件的帮助下完成。
但由于您使用的是 EventSourcing,因此不需要在后台执行此操作。你动态构造聚合结构,这就把我们带到了第二点。
与任何其他 EventSource 投影一样,当您构建聚合对象时,您将需要重构内部数据元素。
如果您希望项目结构作为任务投影的一部分可用,请调用项目应用服务以实时检索项目聚合。
对于您可能希望作为投影一部分的所有链接聚合,以此类推。
我正在努力思考在事件存储中构建关系。我是事件采购方面的新手,所以请多多包涵。 :-)
应该如何在 eventstore 中映射关系?你能给我一些建议吗?
想象一下,我有一个关于项目管理的领域。我有一个 聚合 ,它是一个 Project
。 Project
聚合根包含Tasks
、Documents
、Files
、Folders
,它们是核心实体的集合Project
。
我还有一个 ProjectBranch
,它可以是 Project
聚合的一部分,但也可以独立查看。在 ProjectBranch
中可以更改前面提到的集合,并且可以将 ProjectBranch
再次合并到 Project
中,从而更新 Project
的集合。
部分流程类似于 VCS 系统。
应该如何映射这些关系以及我应该创建聚合和聚合根的哪个分离?
如果 Project
是唯一的聚合,事件(我想)如下所示:
- ProjectWasCreated [聚合]
- ProjectDocumentWasCreated
- ProjectTaskWasCreated
- ProjectBranchWasCreated
- ProjectBranchDocumentWasCreated
(这个事件如何知道文档属于哪个分支)
一旦 ProjectBranchWasMergedToProject 事件发生,ProjectBranch
中发生的所有事件都必须以某种方式在项目上重播。
另一方面,可能会有一个关系更紧密的结构,其中有几个单独的聚合 - 例如Project
、ProjectBranch
、Task
、Document
等。
这意味着该域有一组不同的事件,可能如下所示:
- ProjectWasCreated [聚合]
- DocumentWasCreated [聚合]
- ProjectDocumentWasAttached(documentId)
- ProjectBranchWasCreated(projectId) [聚合]
- DocumentWasCreated [聚合]
- ProjectBranchDocumentWasAttached(documentId)
其中一些功能可能需要在 Project
之外独立工作,因此它们将作为独立模块制作。
谢谢 :-)
假设所有这些元素都是聚合:Project
、ProjectBranch
、Task
、Document
,等等。
构造Aggregates的基本原则之一是它们形成事务一致性边界,这意味着在单个Aggregate中,所有元素必须是一致的,并且在事务发生时满足关联的业务规则。
这就是为什么人们通常坚持使用小型聚合结构,大多数聚合中只有一个实体。随着 Project
的增长,您将不可能使所有这些元素保持同步和一致。
现在回答你的问题,关系的答案分为两部分:
聚合之间的所有链接都应采用聚合标识的形式。如果
Task
链接到Project
,则Task
聚合事件将包含ProjectId
作为属性。你不应该将聚合结构存储在另一个内部。
如果您使用的是 RDBMS,则聚合之间所需的任何同步(例如,如果项目已关闭)都应在域事件的帮助下完成。
但由于您使用的是 EventSourcing,因此不需要在后台执行此操作。你动态构造聚合结构,这就把我们带到了第二点。
与任何其他 EventSource 投影一样,当您构建聚合对象时,您将需要重构内部数据元素。
如果您希望项目结构作为任务投影的一部分可用,请调用项目应用服务以实时检索项目聚合。
对于您可能希望作为投影一部分的所有链接聚合,以此类推。