Grails中有多少域类继承?

时间:2016-01-23 00:58:53

标签: grails inheritance gorm

通过阅读Grails中的docs,我发现了以下声明:

  

但是,过度使用继承和table-per-subclass都可以   由于使用外连接查询,导致查询性能较差。   一般来说,我们的建议是,如果你要使用继承,不要   滥用它,不要让你的继承层次太深。

我的问题是:深度有多深?

继承链中的5个扩展会让Grails哭吗?10?,20?...确定这个的标准是什么?或者我们是否知道是否有明确的方法来推断这种性能下降?

1 个答案:

答案 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 = {
    }
}

您最终会得到两个表:EMPLOYEESUPERVISOREMPLOYEE表格将包含idfirst_namelast_name列。但请注意,SUPERVISOR表格只包含idoffice列。

这意味着检索Supervisor GORM必须连接两个表才能填充继承的属性。

SELECT EMPLOYEE.ID, FIRST_NAME, LAST_NAME, OFFICE
FROM   SUPERVISOR INNER JOIN EMPLOYEE 
       ON SUPERVISOR.ID = EMPLOYEE.ID

这些连接有可能导致性能降低。可以想象,10或20级的继承将是灾难性的。还有一些,特别是如果桌子很小,可能会好的。

此外,深层继承层次结构表明域模型体系结构可能存在错误(即考虑使用Traits)。

您可以在我的文章here中详细了解这两种继承形式。