Domain driven design DDD、CQR、事件源、聚合、相关聚合和持久性

Domain driven design DDD、CQR、事件源、聚合、相关聚合和持久性,domain-driven-design,aggregate,persistence,cqrs,Domain Driven Design,Aggregate,Persistence,Cqrs,我刚刚进入DDD、CQR和事件来源领域,在发布涉及这两个领域的事件时,我对相关聚合的概念以及两者之间可以共享多少数据感到困惑。我的问题。。。我有一个客户聚合,它有一个地址聚合的集合,还有一个在向客户添加地址时发布的事件。地址和客户聚合都与电话号码/销售人员和联系人保持关系 我的理解是,我只能通过id引用另一个聚合中的聚合。添加地址时,是否允许我向客户传递更多关于地址的数据,而不仅仅是地址聚合id,只要我只引用客户聚合中的地址id 我认为我需要额外的数据,因此当我发布事件时,我最终可以将该数据/关

我刚刚进入DDD、CQR和事件来源领域,在发布涉及这两个领域的事件时,我对相关聚合的概念以及两者之间可以共享多少数据感到困惑。我的问题。。。我有一个客户聚合,它有一个地址聚合的集合,还有一个在向客户添加地址时发布的事件。地址和客户聚合都与电话号码/销售人员和联系人保持关系

我的理解是,我只能通过id引用另一个聚合中的聚合。添加地址时,是否允许我向客户传递更多关于地址的数据,而不仅仅是地址聚合id,只要我只引用客户聚合中的地址id


我认为我需要额外的数据,因此当我发布事件时,我最终可以将该数据/关系持久化到读取端的customer addresses表中

当您发现自己试图访问属于另一个聚合的数据时,应仔细检查以确保聚合边界与您的需要一致

也就是说,将信息从一个聚合复制到另一个聚合是合理的。例如,在装运域中,我们可能会将装运地址复制到每个装运中,但我们可能不会在装运实体本身中管理装运地址的生存期


因此,我们倾向于关注哪些实体持有权威信息,哪些实体使用陈旧的不可变副本。请参见Pat Helland

当您发现自己试图访问属于另一个聚合的数据时,您应该仔细检查以确保聚合边界与您的需要一致

也就是说,将信息从一个聚合复制到另一个聚合是合理的。例如,在装运域中,我们可能会将装运地址复制到每个装运中,但我们可能不会在装运实体本身中管理装运地址的生存期


因此,我们倾向于关注哪些实体持有权威信息,哪些实体使用陈旧的不可变副本。请参阅Pat Helland

感谢您的回复和链接。在这种情况下,我相信地址的生命周期是由客户管理的,但由于地址管理自己的联系人/电话号码等,我认为应该将其分解为自己的聚合。无论在将其持久化到用于读取模型的SQL时如何关联这两者?这是地址表、客户表和两者之间的查找表吗?你能给我一个你将如何建模的例子吗?这有助于回到基础。读模型和写模型/域模型是两个完全不同的东西。阅读和/或搜索是在您的阅读模型上完成的,该模型针对任务进行了高度优化。但是写模型是非常基本的。按id查找并按id列出所有事件的顺序大约是您通常需要的(除非您使用快照)。因此,您不会在写端将一个聚合与另一个聚合“关联”,因为这听起来像是一个关系数据模型。@Codescribler我不想将写模型关联起来。现在,事件首先被持久化到事件存储,然后我发布另一个事件以持久化到读取端数据库。我的问题是,一旦数据被持久化到读取端,如何关联“客户和客户地址”?据我所知,您无法直接查询事件存储。感谢您的回复和链接。在这种情况下,我相信地址的生命周期是由客户管理的,但由于地址管理自己的联系人/电话号码等,我认为应该将其分解为自己的聚合。无论在将其持久化到用于读取模型的SQL时如何关联这两者?这是地址表、客户表和两者之间的查找表吗?你能给我一个你将如何建模的例子吗?这有助于回到基础。读模型和写模型/域模型是两个完全不同的东西。阅读和/或搜索是在您的阅读模型上完成的,该模型针对任务进行了高度优化。但是写模型是非常基本的。按id查找并按id列出所有事件的顺序大约是您通常需要的(除非您使用快照)。因此,您不会在写端将一个聚合与另一个聚合“关联”,因为这听起来像是一个关系数据模型。@Codescribler我不想将写模型关联起来。现在,事件首先被持久化到事件存储,然后我发布另一个事件以持久化到读取端数据库。我的问题是,一旦数据被持久化到读取端,如何关联“客户和客户地址”?我的理解是,您不能直接查询事件存储。