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

时间:2015-03-04 03:43:46

标签: java oop

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

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

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

可以接受吗?

提前致谢。

Simple Cirular Reference Example

2 个答案:

答案 0 :(得分:3)

拥有这种循环关系绝对没问题。

当然有很多陷阱可以射击你的脚。然而,这种关系格外谨慎并不总是有害的。

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

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

尽管如此,如果你能设法使它成为单向和非圆形的,它总是更容易处理。

答案 1 :(得分:1)

如果你真的想避免你所描述的情况(员工“E”与部门“D”相关联,但“D”和“E”与不同的公司相关联),你可以尝试制作你的对象模型是一棵树,没有周期:

Company --> Department --> Employee

这里有一些权衡。例如,这个模型并不直接处理没有部门的员工(尽管这可能与像NoDepartment这样的假部门混淆)。此模型可能还需要两个“跃点”才能从员工到公司。