我有一套SQL Server數據庫中使用的分層數據。數據以guid作爲主鍵存儲,parentGuid作爲指向對象直接父項的外鍵。我通過WebApi項目中的實體框架最常訪問數據。爲了使情況稍微複雜一些,我還需要根據這個層次來管理權限,以便應用於父級的權限適用於其所有子級。我的問題是這樣的:分層SQL數據(遞歸CTE vs HierarchyID vs閉包表)
我已經搜遍了所有,不能決定哪個將是最好的處理這種情況。我知道我有以下選擇。
- 我可以創建
Recursive CTEs
公用表表達式(又名RCTE)來處理分層數據。這似乎是普通訪問最簡單的方法,但是我擔心它在用於確定子對象的權限級別時可能會很慢。 - 我可以在表中創建一個
hierarchyId
數據類型字段,並使用SQL Server提供的函數,如GetAncestor()
,IsDescendantOf()
等。這似乎會使查詢變得相當容易,但似乎需要相當複雜的插入/更新觸發器通過插入和移動來保持hierarchyId字段的正確性 - 我可以創建一個
closure table
,它將存儲表中的所有關係。我認爲它是這樣的:父列和子列,每個父 - >子關係將被表示。 (即1-> 2 2-> 3將在數據庫中表示爲1-2,1-3,2-3)。缺點是這需要插入,更新和刪除觸發器,即使它們非常簡單,並且此方法會生成大量記錄。
我已經嘗試過搜索遍地,找不到任何東西給這三種方法之間的任何建議。
PS我也開放給這個問題的任何替代解決方案
請用您正在使用的SQL Server版本標記您的問題。你的疑問傾向於從孩子到父母,還是其他方式?一個RCTE在單個孩子的父母鏈接之後走在樹上應該不會太糟糕。對於所有的孩子來說,其他方式都是緩慢的。 – HABO
我現在無法檢查版本,但會稍後。我認爲儘管它是2008年或更新的。很可能我會更頻繁地得到父母的子女,而不是得到子女的父母 – jp36
我無法添加其他標記,但它是SQL Server 2008 R2。 – jp36