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

PHP 實作無限分類系統(二):資料庫設計與遞迴邏輯

     編輯:PHP 相關知識

無限分類資料表設計:鄰接表模型與路徑枚舉

無限分類核心在於處理「父子關係」的儲存與查詢。本文採用雙欄位策略:uid 記錄父分類 ID,roue_id 以冒號分隔儲存完整祖先路徑(如 :0:2:10:20:),輔以 roue_char 存放可讀路徑(:系統:Linux:開發工具:GCC:)。

分類表

CREATE TABLE `type` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `uid` INT DEFAULT 0 COMMENT '父分類ID',
  `type` VARCHAR(50) NOT NULL COMMENT '分類名稱',
  `roue_id` VARCHAR(255) DEFAULT ':0:' COMMENT '祖先ID路徑',
  `roue_char` VARCHAR(255) DEFAULT '' COMMENT '祖先名稱路徑'
);

內容表

CREATE TABLE `type_message` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `typeid` INT NOT NULL COMMENT '所屬分類ID',
  `title` VARCHAR(200) NOT NULL,
  `message` TEXT,
  `time` DATETIME DEFAULT CURRENT_TIMESTAMP
);

核心操作邏輯

  • 新增分類:讀取父分類 roue_id,附加自身 ID 形成新路徑
  • 查詢子樹:WHERE roue_id LIKE ':0:2:%' 即可取得 ID=2 及所有後代
  • 麵包屑導航:直接解析 roue_char 或 roue_id 反查名稱
  • 移動分類:需遞迴更新該節點及所有後代的路徑欄位

優缺點分析

優點缺點
查詢子樹極快(LIKE 前綴)移動節點需更新所有後代(寫入放大)
路徑資訊冗餘儲存,避免遞迴查詢路徑長度受限於 VARCHAR 上限(約 200 層)
易於產生麵包屑、顯示層級縮排資料冗餘,違反正規化

替代方案

  • 巢狀集合:左/右值編碼,適合讀多寫少
  • 遞迴 CTE (MySQL 8.0+):WITH RECURSIVE 標準 SQL 遞迴查詢,無需冗餘欄位
  • Closure Table:單獨關聯表儲存所有祖先後代關係,查詢靈活

選型建議:中小型專案、分類層級較固定時,本文路徑枚舉法開發效率最高;大型、頻繁重組分類樹者,建議採用 Closure Table 或 MySQL 8.0 CTE。

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