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