继承策略
Inheritance strategy
我知道在 java 中处理继承的策略不止一种,而且最好的性能是通过单个 table 实现的。
下面的架构是 class 图:
抱歉,架构是法语的。无需详细说明,"personne" 表示个人、"employeur" 雇主、"proprietaire" 房东、"locataire" 租户和 "Conge" 假期。
我如何从这个模式中得出我应该使用的最佳继承策略?
你确定吗?
在回答你的具体问题之前,我可以批评一下你的继承逻辑吗?
您的基础 class Person
派生为 Landlord
、 Tenant
和 Employer
。不幸的是,一个 Person
实际上可以同时担任多个(甚至所有)角色(例如,出租他的公寓,并成为雇主)。
当然,您有权像这样对域进行建模,并使用具有相同 Person
数据和不同 id
的多个 objects。但这并不能很好地反映现实世界。因此,如果 Landlord
会更改其地址,您需要检查某些 Employer
或 Tenant
是否对应于同一个人,以更新它们。
Quote of the day: In case of doubt, prefer composition over inheritance
适合您模型的最佳策略
以下是可能的策略:
- 单个table:所有继承的class的所有属性合并到一个大的table中。如果只为每个派生的 class 定义几个附加属性,这种方法效果最好。不幸的是,
Employer
有一个关联,而 Landlord
与 List<Landlord>
有一个隐藏的(自引用)关联。由于不同 children 的关系不同,此模型可能有一些缺点。
- table per (concrete) class: parent class 的所有属性都合并到 child classes。在这种情况下,您最终会得到一个唯一的
Person.id
,它必须在三个 table 中保持唯一。
- join:每个 class 都有自己的 table,适当的连接将各个部分放在一起。这可以满足您在这里的所有要求,并为您提供最佳的灵活性来进化和变得更复杂 children.
所以 加入 将是我推荐的策略。
备选 class 型号
回到我的观察,Tenant
、Landlord
和 Employer
是 Person
的角色,我会以不同的方式建模:没有继承,但是Person
与 Tenant
、Landlord
和 Employer
.
之间存在 0 对多 (0..*
) 关系
在这种情况下,一个人可以存在于我的系统中而没有任何活动角色。我可以 link 它在任何给定时间与任何相关角色相关,如果地址发生变化,我只需要更换一个具有其唯一 ID 的人。这不是一个更接近领域现实的模型吗?
我知道在 java 中处理继承的策略不止一种,而且最好的性能是通过单个 table 实现的。
下面的架构是 class 图:
抱歉,架构是法语的。无需详细说明,"personne" 表示个人、"employeur" 雇主、"proprietaire" 房东、"locataire" 租户和 "Conge" 假期。
我如何从这个模式中得出我应该使用的最佳继承策略?
你确定吗?
在回答你的具体问题之前,我可以批评一下你的继承逻辑吗?
您的基础 class Person
派生为 Landlord
、 Tenant
和 Employer
。不幸的是,一个 Person
实际上可以同时担任多个(甚至所有)角色(例如,出租他的公寓,并成为雇主)。
当然,您有权像这样对域进行建模,并使用具有相同 Person
数据和不同 id
的多个 objects。但这并不能很好地反映现实世界。因此,如果 Landlord
会更改其地址,您需要检查某些 Employer
或 Tenant
是否对应于同一个人,以更新它们。
Quote of the day: In case of doubt, prefer composition over inheritance
适合您模型的最佳策略
以下是可能的策略:
- 单个table:所有继承的class的所有属性合并到一个大的table中。如果只为每个派生的 class 定义几个附加属性,这种方法效果最好。不幸的是,
Employer
有一个关联,而Landlord
与List<Landlord>
有一个隐藏的(自引用)关联。由于不同 children 的关系不同,此模型可能有一些缺点。 - table per (concrete) class: parent class 的所有属性都合并到 child classes。在这种情况下,您最终会得到一个唯一的
Person.id
,它必须在三个 table 中保持唯一。 - join:每个 class 都有自己的 table,适当的连接将各个部分放在一起。这可以满足您在这里的所有要求,并为您提供最佳的灵活性来进化和变得更复杂 children.
所以 加入 将是我推荐的策略。
备选 class 型号
回到我的观察,Tenant
、Landlord
和 Employer
是 Person
的角色,我会以不同的方式建模:没有继承,但是Person
与 Tenant
、Landlord
和 Employer
.
0..*
) 关系
在这种情况下,一个人可以存在于我的系统中而没有任何活动角色。我可以 link 它在任何给定时间与任何相关角色相关,如果地址发生变化,我只需要更换一个具有其唯一 ID 的人。这不是一个更接近领域现实的模型吗?