继承策略

Inheritance strategy

我知道在 java 中处理继承的策略不止一种,而且最好的性能是通过单个 table 实现的。

下面的架构是 class 图:

抱歉,架构是法语的。无需详细说明,"personne" 表示个人、"employeur" 雇主、"proprietaire" 房东、"locataire" 租户和 "Conge" 假期。

我如何从这个模式中得出我应该使用的最佳继承策略?

你确定吗?

在回答你的具体问题之前,我可以批评一下你的继承逻辑吗?

您的基础 class Person 派生为 LandlordTenantEmployer 。不幸的是,一个 Person 实际上可以同时担任多个(甚至所有)角色(例如,出租他的公寓,并成为雇主)。

当然,您有权像这样对域进行建模,并使用具有相同 Person 数据和不同 id 的多个 objects。但这并不能很好地反映现实世界。因此,如果 Landlord 会更改其地址,您需要检查某些 EmployerTenant 是否对应于同一个人,以更新它们。

Quote of the day: In case of doubt, prefer composition over inheritance

适合您模型的最佳策略

以下是可能的策略:

  • 单个table:所有继承的class的所有属性合并到一个大的table中。如果只为每个派生的 class 定义几个附加属性,这种方法效果最好。不幸的是,Employer 有一个关联,而 LandlordList<Landlord> 有一个隐藏的(自引用)关联。由于不同 children 的关系不同,此模型可能有一些缺点。
  • table per (concrete) class: parent class 的所有属性都合并到 child classes。在这种情况下,您最终会得到一个唯一的 Person.id,它必须在三个 table 中保持唯一。
  • join:每个 class 都有自己的 table,适当的连接将各个部分放在一起。这可以满足您在这里的所有要求,并为您提供最佳的灵活性来进化和变得更复杂 children.

所以 加入 将是我推荐的策略。

备选 class 型号

回到我的观察,TenantLandlordEmployerPerson 的角色,我会以不同的方式建模:没有继承,但是PersonTenantLandlordEmployer.

之间存在 0 对多 (0..*) 关系

在这种情况下,一个人可以存在于我的系统中而没有任何活动角色。我可以 link 它在任何给定时间与任何相关角色相关,如果地址发生变化,我只需要更换一个具有其唯一 ID 的人。这不是一个更接近领域现实的模型吗?