DDD - 在单个有界上下文中共享相同数据库表的两个聚合根

时间:2018-02-05 12:34:38

标签: domain-driven-design aggregate

我有一个第一个聚合根,它具有与同一主题相关的自然Id封装不变量。

突然之间,一个新的业务需求出现在一个与第一个聚合完全不同的主题上的一组新的不变量上。这是在同一有界环境中创建新聚合根的绝佳时机。

但是,两个聚合根都具有相同的自然Id。并且两个聚合根都具有一些相同的属性(但不是全部)。可以修改这些相同的属性,但我不想引入域事件流来传播这两个聚合中的数据更改(因为我们无法在同一事务中修改两个聚合)。

一个选项是重新组合这些聚合根。它们处于相同的有界环境中,并且它们具有相同的自然Id(它们"代表"相同的东西),所以它感觉很自然。但是有了这个选择,聚合就会变得巨大。大小不是一个真正的问题,但合并真正不同类型的不变量会让我烦恼。

如果要将这些聚合在域中分开,但依赖于相同的数据库表来共享数据呢?

对此有何看法? 另一种选择吗?

1 个答案:

答案 0 :(得分:3)

使用聚合的一个最大优势是强制执行不变量并确保聚合始终处于有效状态。这可以得到保证,因为聚合根确保整个聚合的完整性。如果允许使用其他任何机制更改聚合的数据,那么通过聚合根,您将不再确定它是否处于有效状态。因此,如果您在2个聚合之间共享表,您将失去聚合提供的主要优势之一。

通过复制聚合,无处不在的语言将不再反映在代码中,因为实际业务中只有一个聚合。

关于你的例子:

  

突然之间,一个新的业务需求出现在一个与第一个聚合完全不同的主题上的一组新的不变量。

这听起来像是另一个有限的背景。因此,我建议将新聚合移动到另一个有界上下文,但如果您确定它属于相同的有界上下文,则不要创建新的聚合。只需将新业务规则添加到现有规则即可。复制聚合绝对是一个坏主意。