领域驱动设计:如何处理概念上较大的聚合根?

Jam*_*mes 5 validation domain-driven-design one-to-many aggregateroot

我正在尝试对一个非常简单的域进行建模,该域具有概念上的(一个)PARENT -->(许多)CHILD。问题是这种关系中的孩子数量可能以数百万计。

我正在尝试构建一个聚合根,它允许我一次“放置”(如果不存在则更新或插入)一个孩子。但是,正在更新的值必须由父级事先验证。

我可以使用什么模式来解决这个问题?目前我考虑了以下几点:

PARENT 作为聚合根

  • +验证很简单,因为孩子是通过父母访问的
  • - 性能不佳,因为可能必须检索数百万个孩子才能仅更新一个
  • +/- 我可以进行延迟加载吗?由于一致性问题,我阅读了大量文章,称这是 DDD 反模式

CHILD 作为聚合根

  • +性能仅检索要更新的数据
  • - 验证因为非平凡,要么父必须是根的实体,要么根必须从外部提供给父来做验证。这两个选项都会导致问题:
    • 因为更新是“放置”风格,第一个选项使得子项的创建变得困难(如果我在存储库的 find(id) 方法中实现创建,那么我没有必要的信息来构造子项,如果我把它在调用存储库的服务中,然后我没有办法访问父信息,因为它不是聚合根)。
    • 第二个选项会导致一致性问题,即我可以提供一个不是正在更新的孩子的父母的父母。

两者都作为聚合根

  • +/- 如何确保一致性,即子项由其实际父项验证?

Mik*_*eSW 1

您还没有理解什么是聚合根(AR)。它不是孩子的父容器。这是一个概念,其中has应该按照 的定义进行处理。一对多与识别 AR 无关。

“子”是一个存在于 AR 上下文中有意义的概念,即它是 AR 所表示的聚合的一部分。您的示例似乎定义了一个存储库,一个项目容器。它看起来确实有点像 CRUD 功能。

您确定您处于聚合状态,而不是处于简单服务就足够的环境中吗?