建模聚合对象的正确方法是什么?

时间:2013-09-10 02:54:31

标签: java oop object-oriented-analysis

我有两个域实体:EmployeeTeam。你猜猜团队有0 ... * Employee s。建模它们的正确性是什么?

选项1:

class Team{
  List<Employee> members;
}

这可能是最直观的方式,但这意味着当我只需要显示Team infos时,我必须加载很多Employee s,这是完全浪费的。也许我可以添加一些延迟加载(可能是抛出代理)机制,但这会给我们带来很多复杂性

选项2:

class Team{
  List<Long> memberIds;
}

这个选项不会加载太多不必要的Employee但是从建模的角度来看可能(我不确定)不是一个好的设计

选项3:

class Team{} 
class Employee{
  Team team;
}

在此选项中,我可以通过Team的属性查询Employee的{​​{1}}。但我认为,从建模的角度来看,我可能(我不确定),Employee不应该知道它是如何组织的,Employee也是一个没有{Employee的实体。 {1}}

你觉得男人怎么样?

2 个答案:

答案 0 :(得分:1)

第一个选项很简单&amp;最好的。

class Team{
    List<Employee> members;
}

您可以在Hibernate或许多其他JPA实现中设置批量大小,这样当必须获取Employees时,它们一次被取出10个或者某些东西。这需要很少的时间来获取,并且Hibernate在您需要它之前不会获取集合。

“ID集”没有帮助 - 它不提供团队成员的名称,并且在您需要时不会加快加载速度。

一般规则是,在需要之前不要进行优化。

但如果您需要,可以考虑两种选择:

  1. 为Team.members和Employee启用EH-Cache或类似的二级缓存;
  2. 在Team中存储聚合“团队成员名称”属性。 注意:这只能保证最新,并且必须截断以避免溢出它的最大列大小。
  3. 但作为“指示性显示文本”,而不是权威价值,第二种选择会没问题。

答案 1 :(得分:0)

你必须考虑这样一个事实:你的团队成员中不应该在逻辑上彼此相等(或者你想要1000个'Agent Smith'克隆为你的团队而战:-))。 更好地建立这样的关系:

Set<Employee> members;