2016-01-23 77 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中閱讀有關這兩種繼承形式的更多信息。