Domain driven design 领域驱动设计中的聚合关系

Domain driven design 领域驱动设计中的聚合关系,domain-driven-design,Domain Driven Design,我有一个关于领域驱动设计中聚合之间关系的问题 我有以下情况:我有一个汇总(问卷),其中有一些孩子(问题)。这些问题是实体,但由于它们位于问卷聚合中,因此它们可以具有本地身份(即id为1234的问卷中id为1的问题;我可以在另一个问卷中有id为1的另一个问题)。因此,要引用一个问题,您必须始终使用其父问卷id对其进行限定 另一方面,我有另一个聚合(收集活动),它存储问卷中问题的数据(响应集)(收集活动通过其id指向问卷,响应集通过其id再次指向问题)。我可以有几个收集活动(可能发生在不同的时间),

我有一个关于领域驱动设计中聚合之间关系的问题

我有以下情况:我有一个汇总(问卷),其中有一些孩子(问题)。这些问题是实体,但由于它们位于问卷聚合中,因此它们可以具有本地身份(即id为1234的问卷中id为1的问题;我可以在另一个问卷中有id为1的另一个问题)。因此,要引用一个问题,您必须始终使用其父问卷id对其进行限定

另一方面,我有另一个聚合(收集活动),它存储问卷中问题的数据(响应集)(收集活动通过其id指向问卷,响应集通过其id再次指向问题)。我可以有几个收集活动(可能发生在不同的时间),每个收集活动存储不同的响应集,但针对相同的问卷(和问题)

所以我的问题是:我是否设计得很好(根据DDD)?或者我是否必须将问卷和问题作为单独的集合保存,以便从收集活动/响应集中引用它们


我希望这是有意义的,谢谢你。

问问你自己:应该保护哪些不变量

在您的情况下,您必须确保在活动期间回答的问题存在(即其索引介于0和问卷中的问题数-1之间),并且是允许的;另一个不变量可能是,在回答至少一个问题后,不得修改问卷;在这些情况下,活动必须与问卷同步。我至少看到两种解决方案:

  • 最简单的解决方案是有一个大的聚合,即
    Questionare
    聚合,将问题、活动和答案作为子实体,这样您就可以保护这些不变量;这对性能有一定影响,但只有您知道这是可以接受的

  • 第二种解决方案是使用事件驱动的体系结构,如CQRS+事件源。在这种情况下,您可以使用一个简单的Saga将
    Questionare
    aggregate(如
    QuestionAdded
    QuestionRemoved
    )中的一些事件作为命令转发到
    Campaingn
    aggregate,以使它们保持同步。我更喜欢这个解决方案,因为它能更好地区分责任


  • 一个问题本身,在问卷之外,是没有意义的。这是一个值得保护的不变量吗?而且,如果我们假设是这样,那么我如何“引用”调查问卷集合之外的问题,收集活动集合内部的问题,以链接响应集?我正在尝试解决这个问题,但我需要帮助。请参阅我的更新答案