通过阅读Grails中的docs,我发现了以下声明:
但是,过度使用继承和table-per-subclass都可以 由于使用外连接查询,导致查询性能较差。 一般来说,我们的建议是,如果你要使用继承,不要 滥用它,不要让你的继承层次太深。
我的问题是:深度有多深?
继承链中的5个扩展会让Grails哭吗?10?,20?...确定这个的标准是什么?或者我们是否知道是否有明确的方法来推断这种性能下降?
答案 0 :(得分:2)
有多深?是一个相当主观的问题。但是,当您考虑在数据库级别使用table-per-subclass继承时发生的事情时,可以做出有根据的猜测。让我们假设您有这些域类:
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中详细了解这两种继承形式。