首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 無限級分類實作:遞迴與非遞迴 (路徑編碼) 兩大核心演算法

     編輯:關於ASP.NET

新聞、商品、部落格、論壇皆需分類,固定 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,
    ...
);

路徑編碼規則

  • 根節點:`001`、`002` (固定 3 碼,支援 999 同級)。
  • 子節點:父路徑 + `.` + 3 碼序號 (如 `001.003.012`)。
  • 長度預估:10 層 × 4 字元 = 40 字元,`VARCHAR(1000)` 綽綽有餘。

核心查詢 (非遞迴、極高效能)

1. 取得某分類下所有子孫分類


SELECT * FROM Category
WHERE CategoryPath LIKE '001.003.%' -- 001.003 為父分類路徑
ORDER BY CategoryPath;

2. 取得某分類下所有商品 (含子分類商品)


SELECT * FROM Product
WHERE CategoryPath LIKE '001.003.%'
ORDER BY CategoryPath, ProductName;

3. 顯示樹狀結構 (前端縮排)


SELECT CategoryName, CategoryLevel, CategoryPath
FROM Category
ORDER BY CategoryPath;

前端依 `CategoryLevel` 輸出 `    ` 縮排,或對應 `

  • ` 巢狀結構。

    新增/移動節點邏輯

    • 新增:查詢同父最大序號 +1,生成新路徑,`CategoryLevel = Parent.Level + 1`。
    • 移動子樹:批次更新 `CategoryPath` (REPLACE 舊父路徑 → 新父路徑)、`CategoryLevel` (加減差值)、`Product.CategoryPath` 同步更新。單一 `UPDATE` 即可完成整棵子樹移動,無需遞迴。

    遞迴 vs 路徑編碼 比較

    指標遞迴 (CTE/迴圈)路徑編碼
    查詢子樹效能隨深度/廣度線性增長單一 Index Seek,極快
    移動子樹需遞迴更新每節點單一 REPLACE 批次更新
    資料完整性外鍵天然保護需觸發器/應用層維護 Path 一致性
    最大深度受 CTE MaxRecursion 限制路徑長度上限 (極大)

    建議

    讀多寫少、深度不固定、需高效能樹狀查詢 → **路徑編碼法**。
    寫入頻繁、需嚴格外鍵約束、深度固定 → **遞迴 CTE** (SQL Server 2008+ `WITH RECURSIVE`)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved