繁体   English   中英

DDD:用户聚合根与其他聚合中几乎所有实体之间的一对多关系

[英]DDD: one-to-many relationship between user aggregate root and almost all entities in other aggregates

我有以下 DDD 场景,分为以下聚合:

用户,
朋友(用户协会),
文件(供用户上传),
画廊(文件分组),
消息(用户通信),
组(用户可以创建,其他成员可以加入),
GroupMessages(发送给组内所有成员的消息),
GroupForums(小组成员可以讨论各种主题)

这就是令人困惑的地方。 用户与 GroupForums 的所有内容相关联。 必须通过用户存储库才能访问其他聚合似乎不合逻辑,尽管从级联的角度来看,如果我删除了用户,从技术上讲,与用户关联的记录也应该消失。

似乎我也不应该将此处存在的所有一对多关联都添加到用户实体中,因为从数据库中补水似乎很荒谬,尤其是当我尝试提取与用户关联的每条记录时。 组织聚合和存储库的推荐策略是什么,以及处理给定实体的大量一对多关系的正确方法是什么?

您在句子“A user is associated with everything...”中使用了“关联”一词,这一事实非常有线索。 聚合根被关联甚至一个“属于”另一个是绝对好的。 但是,您需要查看一个实体是否可以在没有 AR 的情况下存在。 如果可以的话,它可能有自己的生命周期,应该是一个 AR。 如果不能,则它是聚合的一部分。 这可能很难蒸馏。

你需要在你的 AR 周围有一个非常清晰的界限。 例如,即使论坛可能需要用户创建它,但这并不意味着在删除用户时需要(甚至可以)删除论坛。 因此,论坛中的用户可能会成为仅包含用户名和 id 的ForumCreator (一个值对象)。 删除用户后,论坛可以继续存在。

在 Order/OrderLine/Product 场景中,如果您选择删除包含特定产品的所有订单行,则删除它没有多大意义。 我知道一个产品可能永远不应该被删除,但我们会以它为例。 您只需将相关产品数据“非规范化”到订单行中,例如:产品 ID、产品名称。 因此,即使产品名称发生更改,也不意味着所有订单行都需要更新,甚至应该更新。 事实上,订单行代表一个时间点,应该保留“原始”产品名称。 购买者可能订购了“Some lirril product”,然后名称更改为“Little product”。 不一样的东西,虽然它是完全相同的产品。 购买者只记得原件。

我希望这是有道理的,并在某种程度上有所帮助。 你肯定需要找到你的对象图的那些硬边才能得到真正的聚合。

在 IDDD 书中,Aggregate 是一致性边界,如果这些实体没有事务一致性需求,它们可能是不同的 Aggregate。 我们不应该通过依赖项来设计聚合。 如果是这样,您将拥有大型集群聚合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM