無限分類核心在於處理「父子關係」的儲存與查詢。本文採用雙欄位策略: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 層) |
| 易於產生麵包屑、顯示層級縮排 | 資料冗餘,違反正規化 |
WITH RECURSIVE 標準 SQL 遞迴查詢,無需冗餘欄位選型建議:中小型專案、分類層級較固定時,本文路徑枚舉法開發效率最高;大型、頻繁重組分類樹者,建議採用 Closure Table 或 MySQL 8.0 CTE。