Domain driven design 领域驱动设计-子实体相对于父实体的顺序

Domain driven design 领域驱动设计-子实体相对于父实体的顺序,domain-driven-design,entity-relationship,aggregate,invariants,Domain Driven Design,Entity Relationship,Aggregate,Invariants,比如说,我有两个父母和孩子。父母可以有许多孩子。 一个孩子只能属于一个父母 我需要跟踪子实体的排序顺序,这样当您获取父实体的子实体时,列表就按照该顺序排列 显而易见的数据库架构如下所示: 然而,该模型的一个不变量需要是该顺序定义良好。 所以,如果您有一个关于Child的方法,Child.SetOrdinalint,那么这个不变量是不受保护的,没有什么可以阻止您将两个Child设置为序号3。 我不想把所有的东西都集中在一起 我看到的另一种选择是如下所示的数据库: 在我引入了一个链接表来存储关系和

比如说,我有两个父母和孩子。父母可以有许多孩子。 一个孩子只能属于一个父母

我需要跟踪子实体的排序顺序,这样当您获取父实体的子实体时,列表就按照该顺序排列

显而易见的数据库架构如下所示:

然而,该模型的一个不变量需要是该顺序定义良好。 所以,如果您有一个关于Child的方法,Child.SetOrdinalint,那么这个不变量是不受保护的,没有什么可以阻止您将两个Child设置为序号3。 我不想把所有的东西都集中在一起

我看到的另一种选择是如下所示的数据库:

在我引入了一个链接表来存储关系和顺序的地方,它将位于父聚合中,在父聚合中可以保护不变量。然而,这确实增加了数据库的复杂性


还有其他方法吗,或者第一个更简单的版本没有那么糟糕吗?

采用第一种方法时,假设父对象和子对象是聚合对象,您的模型可能如下所示:

public Class Parent {
    private Long id;
}

public Class Child {
    private Long id;
    private Long parentId; // most orm need this field.
}
然后可以使用childRepository.findByparentId:List检索属于父级的所有子级,并使用parentRepository.findBychild.getParentId:Parent检索子级的父级。但这不是你的情况,因为你说过,模型的一个不变量需要是这个顺序定义得很好。这导致了另一种方法:将父对象和子对象作为AggregateRoot,并使用ValueObject来保持关系:

public Class Parent {
    private Long id;
    private List<LineChild> children;
}

public class LineChild {
    private int ordinal;
    private Long childId;
}

public Class Child {
    private Long id;
}
但是在我的例子中,大多数orm都不支持这一点,而是使用了第二个db模式。一些半orm工具可以提供帮助,比如iBATIS

<resultMap class="Parent">
    <property name="id" column="id" />
    <property name="children" column="id" select="findChilren"/>
</resultMap>

<select id="findChilren" parameterClass="long" resultMap="LineChild">
    select * from Child where parant_id = #parantId# order by ordinal
</select>

<resultMap id="LineChild" class="LineChild">
    <property name="ordinal" column="ordinal" />
    <property name="childId" column="id"/>
</resultMap>
但是您失去了orm框架的所有好处,例如动态更新等等

或者,考虑最终一致性?

最后,我很困惑,为什么一个孩子只能属于单亲?我有妈妈和爸爸P