0

我有两个域实体:EmployeeTeam. 你可以猜到 Team 有 0...*Employee秒。建模它们的正确性是什么?

选项1:

class Team{
  List<Employee> members;
}

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

选项2:

class Team{
  List<Long> memberIds;
}

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

选项 3:

class Team{} 
class Employee{
  Team team;
}

在这个选项中,我可以通过 a的属性查询 aTeam的s。但我认为也许(我不确定)从建模的角度来看,a不应该知道它是如何组织的,并且也是一个可以在没有 a 的情况下生存的实体EmployeeEmployeeEmployeeEmployeeTeam

你们觉得怎么样?

4

2 回答 2

1

第一个选项简单且最好。

class Team{
    List<Employee> members;
}

您可以在 Hibernate 或许多其他 JPA 实现中设置批量大小,以便当必须提取员工时,一次提取 10 个或类似的。这需要很少的时间来获取,并且 Hibernate 在您需要之前不会获取集合。

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

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

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

  1. 为 Team.members 和 Employee 开启 EH-Cache 或类似的二级缓存;
  2. 在 Team 中存储聚合的“团队成员名称”属性。 注意:这只能保证有限的最新性,并且必须截断以避免溢出它的最大列大小。

但是作为“指示性显示文本”,而不是权威值,第二种选择就可以了。

于 2013-09-10T03:17:04.767 回答
1

您必须考虑这样一个事实,即您的团队中不应该有逻辑上彼此相等的成员(或者您可能希望 1000 个“特工史密斯”克隆人为您的团队而战 :-))。更好地模拟这样的关系:

Set<Employee> members;
于 2013-09-11T17:21:59.980 回答