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