首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2008 新資料型別:HierarchyID 階層資料原生支援

     編輯:關於SqlServer

關聯式資料庫處理樹狀階層結構向來棘手。SQL 2005 引入 CTE (Common Table Expressions) 遞迴查詢緩解;SQL 2008 推出 **HierarchyID** 原生型別,將階層位置作為第一級公民儲存。

HierarchyID 特性

  • 儲存節點在樹中的**絕對路徑** (二進位編碼),如 / (根)、/1/、/1/1/。
  • 變更父節點需更新該節點及所有子孫的 HierarchyID,**非原子操作**,效能成本隨子樹大小增長。
  • 適用「父節點變更頻率低」場景 (如組織架構、產品分類、檔案目錄)。

核心方法

方法用途
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) (廣度優先)。
  • 若頻繁移動節點、樹深度大、高併發寫入,**CTE 遞迴查詢 + ParentID 傳統模式** 可能更靈活。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved