新聞、商品、部落格、論壇皆需分類,固定 2-3 層不夠彈性。無限級分類 採 `ParentID` 自關聯,配合 `CategoryPath` (路徑編碼) 實現高效能查詢,避免遞迴效能瓶頸。
CREATE TABLE Category (
CategoryID INT IDENTITY PRIMARY KEY,
ParentID INT NOT NULL DEFAULT 0, -- 父節點 ID,0=根
CategoryPath VARCHAR(1000) NOT NULL, -- 路徑編碼,如 '001.003.012'
CategoryName NVARCHAR(100) NOT NULL,
CategoryLevel INT NOT NULL, -- 層級深度 (冗餘欄位,便於排序/縮排)
CategoryDescn NVARCHAR(500) NULL, -- 描述/SEO 關鍵字
CategoryOrder INT NOT NULL DEFAULT 0 -- 同級排序
);
CREATE TABLE Product (
ProductID INT IDENTITY PRIMARY KEY,
CategoryID INT NOT NULL REFERENCES Category(CategoryID),
CategoryPath VARCHAR(1000) NOT NULL, -- 冗餘分類路徑,單表查詢商品
ProductName NVARCHAR(200) NOT NULL,
...
);
SELECT * FROM Category
WHERE CategoryPath LIKE '001.003.%' -- 001.003 為父分類路徑
ORDER BY CategoryPath;
SELECT * FROM Product
WHERE CategoryPath LIKE '001.003.%'
ORDER BY CategoryPath, ProductName;
SELECT CategoryName, CategoryLevel, CategoryPath
FROM Category
ORDER BY CategoryPath;
前端依 `CategoryLevel` 輸出 ` ` 縮排,或對應 `
| 指標 | 遞迴 (CTE/迴圈) | 路徑編碼 |
|---|---|---|
| 查詢子樹效能 | 隨深度/廣度線性增長 | 單一 Index Seek,極快 |
| 移動子樹 | 需遞迴更新每節點 | 單一 REPLACE 批次更新 |
| 資料完整性 | 外鍵天然保護 | 需觸發器/應用層維護 Path 一致性 |
| 最大深度 | 受 CTE MaxRecursion 限制 | 路徑長度上限 (極大) |
讀多寫少、深度不固定、需高效能樹狀查詢 → **路徑編碼法**。
寫入頻繁、需嚴格外鍵約束、深度固定 → **遞迴 CTE** (SQL Server 2008+ `WITH RECURSIVE`)。