从阅读中的Grails的docs我发现下面的语句:Grails中的域类继承有多少?
然而,可以 结果查询性能差,由于使用外连接查询的过度使用继承和表每个子类。 一般来说,我们的建议是,如果您要使用继承,请不要使用 来滥用继承,也不要让继承层次太深。
我的问题是:有多深?
继承链中的5个扩展会使Grails哭泣吗?,10?,20?......判断这个的标准是什么?或者我们知道是否有明确的方法推断这种性能下降?
从阅读中的Grails的docs我发现下面的语句:Grails中的域类继承有多少?
然而,可以 结果查询性能差,由于使用外连接查询的过度使用继承和表每个子类。 一般来说,我们的建议是,如果您要使用继承,请不要使用 来滥用继承,也不要让继承层次太深。
我的问题是:有多深?
继承链中的5个扩展会使Grails哭泣吗?,10?,20?......判断这个的标准是什么?或者我们知道是否有明确的方法推断这种性能下降?
有多深?是一个相当主观的问题。但是,当您考虑在数据库级别发生的每个子类的继承时发生的情况时,可以进行有根据的猜测。让我们假设你有这些领域类:
class Employee {
String firstName
String lastName
static constraints = {
}
static mapping = {
tablePerHierarchy false
}
}
class Supervisor extends Employee {
String office
static constraints = {
}
}
你最终有两个表:EMPLOYEE
和SUPERVISOR
。 EMPLOYEE
表将包含列id
,first_name
和last_name
。但请注意,SUPERVISOR
表只包含列id
和office
。
这意味着要检索Supervisor
GORM必须连接两个表才能填充继承的属性。
SELECT EMPLOYEE.ID, FIRST_NAME, LAST_NAME, OFFICE
FROM SUPERVISOR INNER JOIN EMPLOYEE
ON SUPERVISOR.ID = EMPLOYEE.ID
这些连接有可能导致性能下降。正如你所想象的那样,10或20级的继承将会是灾难性的。然而,少数人,特别是如果桌子很小,可能会好起来。
此外,深层继承层次结构是一个迹象表明域模型体系结构可能有问题(即考虑使用Traits)。
您可以在我的文章here中阅读有关这两种继承形式的更多信息。