域模型中是否可以接受实体循环引用?

Is acceptable Entity circular reference in domain model?

我见过很多设计有循环引用的域。下图描述了一个简单的例子来理解这个问题:一个公司有员工和部门,一个部门有员工,他们属于一个部门。

从逻辑上讲,该模型允许为一家公司工作的员工与另一家公司的部门相关联 - 当然,假设是,如果业务逻辑验证失败。

在一些更复杂的情况下,根据业务规则,我看不到另一种建模方式。

可以接受吗?

提前致谢。

如果您真的想避免您所描述的情况(员工 "E" 与部门 "D" 相关联,但 "D" 和 "E" 是与不同的公司相关联),你可以尝试让你的对象模型成为一棵没有循环的树:

Company --> Department --> Employee

这里需要权衡取舍。例如,这个模型不直接处理没有部门的员工(尽管这可以用像 NoDepartment 这样的假部门来掩盖)。此模型可能还需要两个 "hops" 从员工到公司。

有这样的循环关联绝对没问题。

当然有很多陷阱会让你大吃一惊。然而,如果格外小心,这种关系并不总是有害的。

您需要特别注意的事项包括:

  • 尝试定义关系的"owner"。如果您要持久化实体,这一点尤其重要
  • 确保所有关系不是循环的。例如,在您的示例中,您可以定义 Company 拥有 Company-DepartmentCompany-Employee 关系,并且 Department 拥有 Department-Employee 关系
  • 确保关系一致。例如,对于 EmployeeDepartment 之间的双向关系,当您从 Department 中删除 Employee 时,请确保从中删除 Department Employee 始终如一。
  • 尽量减少处理关系的方式。例如,不要同时提供 Department#addEmployee(Employee)Employee#addDepartment(Department),而只提供 Department#addEmployee(Employee)。这应该会使您保持一致性的工作更容易。

不过,如果你能设法让它成为单向的和非圆形的,它总是更容易处理。