2016-01-23 73 views
0

从阅读中的Grails的docs我发现下面的语句:Grails中的域类继承有多少?

然而,可以 结果查询性能差,由于使用外连接查询的过度使用继承和表每个子类。 一般来说,我们的建议是,如果您要使用继承,请不要使用 来滥用继承,也不要让继承层次太深。

我的问题是:有多深?

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

回答

2

有多深?是一个相当主观的问题。但是,当您考虑在数据库级别发生的每个子类的继承时发生的情况时,可以进行有根据的猜测。让我们假设你有这些领域类:

class Employee {  
    String firstName 
    String lastName 

    static constraints = { 
    } 

    static mapping = { 
     tablePerHierarchy false 
    } 

} 

class Supervisor extends Employee { 
    String office 

    static constraints = { 
    } 
} 

你最终有两个表:EMPLOYEESUPERVISOREMPLOYEE表将包含列id,first_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中阅读有关这两种继承形式的更多信息。