傳統無限級分類依賴「ID、ParentID、Name」三欄,查詢子樹需遞歸或 CTE,效能隨層級增長而下降。本文提出「深度欄位」設計,將完整祖先路徑編碼儲存,實現單一 SQL 查詢全量子分類。
| 欄位 | 說明 | 範例值 |
|---|---|---|
| ID | 主鍵 | 40, 43 |
| ParentID | 父分類 ID | 0 (根), 40 |
| Name | 分類名稱 | 新聞, 體育 |
| Depth | 祖先路徑編碼 | 40, 43, 40,43, 40,43,45 |
| SortOrder | 同層排序 | 23, 23.01, 23.02 |
Depth = ID(如 40、43)Depth = 父.Depth + "," + 自身ID(如 40,43、40,43,45)|、-、_),建議使用非數字字元-- 取得 ID=43 及其所有後代
SELECT * FROM Category
WHERE Depth = '43' OR Depth LIKE '43,%'
原理:Depth 以祖先 ID 開頭,LIKE '43,%' 精準匹配所有直系後代。索引支援下效能極佳,避免遞歸多次查詢。
父排序.兩位數序號(23.01、23.02)父排序.序號.序號(23.01.01)| 優點 | 缺點 |
|---|---|
| 查詢子樹極快,單一 SQL | 移動節點需更新整棵子樹 Depth |
| 排序直觀,字串排序即樹序 | Depth 欄位長度隨層級增長 |
| 資料庫手工維護直觀易懂 | 需應用層保證編碼一致性 |
| 適合讀多寫少的分類系統 | 不適用頻繁調整層級的場景 |