關聯式資料庫處理樹狀階層結構向來棘手。SQL 2005 引入 CTE (Common Table Expressions) 遞迴查詢緩解;SQL 2008 推出 **HierarchyID** 原生型別,將階層位置作為第一級公民儲存。
/ (根)、/1/、/1/1/。| 方法 | 用途 |
|---|---|
GetAncestor(n) | 取得第 n 層祖先節點 |
GetDescendant(child1, child2) | 取得兩子節點間的**新節點位置** (非現有子節點),用於插入新節點 |
IsDescendantOf(parent) | 判斷是否為指定節點的子孫 |
GetLevel() | 取得節點深度 (根為 0) |
ToString() / Parse(string) | 二進位 ↔ 字串路徑轉換 |
Read/Write (BinaryReader/Writer) | 支援序列化 |
DECLARE @parent HIERARCHYID = HIERARCHYID::Parse('/1/');
DECLARE @lastChild HIERARCHYID = (
SELECT MAX(Hid) FROM Org WHERE Hid.GetAncestor(1) = @parent
);
DECLARE @newHid HIERARCHYID = @parent.GetDescendant(@lastChild, NULL);
INSERT INTO Org (Hid, Name) VALUES (@newHid, 'New Node');
Hid。CREATE INDEX IX_Org_Hid ON Org(Hid) (深度優先順序) 或 CREATE INDEX IX_Org_Level_Hid ON Org(GetLevel(), Hid) (廣度優先)。