# **無限級分類設計**
> 無限級分類是從頂級節點開始,每一個節點可以有多個子節點(寬),以及多層節點(高);
*****
### **解決方案**
1. 使用遞歸算法,也是使用頻率最多的,大部分開源程序也是這么處理,不過一般都只用到四級分類。這種算法的數據庫結構設計最為簡單。category表中一個字段id,一個字段fid(父id)。這樣可以根據WHERE id = fid來判斷上一級內容,運用遞歸至最頂層。
分析:通過這種數據庫設計出的無限級,可以說讀取的時候相當費勁,所以大部分的程序最多3-4級分類,這就足以滿足需求,從而一次性讀出所有的數據,再對得到數組或者對象進行遞歸。本身負荷還是沒太大問題。但是如果分類到更多級,那是不可取的辦法。
這樣看來這種分類有個好處,就是增刪改的時候輕松了…然而就二級分類而言,采用這種算法就應該算最優先了。
2. 相比于遞歸算法,第二種優勢非常大; 經典案例電腦文件夾設計
> 1. 頂級節點為電腦
> 2. 2級節點有 A、B、C、D、E、F、G盤等N個盤
> 3. 每一個盤都會有N多個文件夾,文件夾套文件夾;文件夾會有子節點存在,文件是當前節點的終止
### **數據庫設計**
```
CREATE TABLE `eb_category` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '父級ID',
`path` varchar(255) NOT NULL DEFAULT '/0/' COMMENT '路徑',
`name` varchar(50) NOT NULL COMMENT '分類名稱',
`type` smallint(2) DEFAULT '1' COMMENT '類型,A盤,2 B盤,3 C盤, 4 D盤, 5 E盤',
`url` varchar(255) DEFAULT '' COMMENT '自定義跳轉地址',
`extra` text COMMENT '擴展字段 Jsos格式',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態, 1正常,0失效',
`sort` int(5) NOT NULL DEFAULT '99999' COMMENT '排序',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`) USING BTREE,
KEY `status+pid` (`pid`,`status`),
) ENGINE=InnoDB AUTO_INCREMENT=305 DEFAULT CHARSET=utf8 COMMENT='分類表';
```
```[sql]
CREATE TABLE `category` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '父級ID',
`path` varchar(255) NOT NULL DEFAULT '/0/' COMMENT '路徑',
`name` varchar(50) NOT NULL COMMENT '分類名稱',
`type` smallint(2) DEFAULT '1' COMMENT '類型,A盤,2 B盤,3 C盤, 4 D盤, 5 E盤',
`url` varchar(255) DEFAULT '' COMMENT '自定義地址',
`extra` text COMMENT '擴展字段 Jsos格式',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態,1 正常,0 失效',
`sort` int(5) NOT NULL DEFAULT '99999' COMMENT '排序',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=305 DEFAULT CHARSET=utf8 COMMENT='分類表';
```
* [ ] ### **需要思考的問題**
> 1. 為什么需要path字段
> 2. path字段如何設計
> 3. 為什么要設計url字段
> 4. 如何快速正查詢,反查詢
> 4.1. 如何快速定位一個頂級節點下所有的子節點,形成樹形結構需要
> 4.2. 如何通過一個子節點快速查詢出父節點
> 5. 無限級分類的應用場景
> 6. 在項目中如何應用
### **PHP代碼如何實現樹形結構**
```
<?php
/**@formatCategory 無線級分類處理
* @param array $data 數據源
* @param string $fieldName 字段名
* @return array
* @author 張先生
* @date 2020-03-27
*/
if(!function_exists('formatCategory')){
function formatCategory(array $data , string $idName = "id", string $fieldName = 'pid', $childrenKey = 'child')
{
$items = [];
foreach ($data as $item) {
$items[$item[$idName]] = $item;
}
$result = array();
foreach($items as $item){
if(isset($items[$item[$fieldName]])){
$items[$item[$fieldName]][$childrenKey][] = &$items[$item[$idName]];
}else{
$result[] = &$items[$item[$idName]];
}
}
return $result;
}
}
```
[幾個常用的PHP方法](https://gitee.com/shmilyle/common_func/blob/master/common_func.php)
- 序言
- 快速上手
- 項目架構圖
- App功能圖
- Admin功能圖
- 快速了解
- 快速開始
- 本地開發
- 服務器及系統搭建
- 服務器購買
- 域名購買(已有域名則跳過)
- 域名解析
- 服務器配置
- 寶塔配置
- 創建站點
- 服務部署
- Docker預覽
- 新手入門
- 運行項目和打包前準備
- Java項目運行和打包
- VUE WEB PC 管理端運行和打包
- Uniapp 移動端運行和打包
- 第三方
- 客服_騰訊云智服
- 客服_螞蟻智能客服
- 復制第三方平臺商品99API
- 公眾號
- 公眾號配置
- 公眾號開發配置
- 公眾號設置菜單
- 公眾號設置關鍵字
- 公眾號設置跳轉網頁
- 公眾號設置跳轉小程序
- uniapp打包H5、公眾號
- 公眾號模板消息
- 微信小程序
- 微信平臺配置
- CRMEB后臺配置
- 微信小程序提交審核
- 微信小程序版本發布
- 微信小程序訂閱消息
- 微信小程序客服
- 添加微信交易組件
- 秒殺產品
- 支付
- 微信支付配置
- 微信公眾號支付
- 微信小程序支付
- 支付寶支付
- App
- 1、基礎配置
- 2、開發調試
- 4、打包上線
- 5、APP打包
- 6、App升級
- 使用說明
- 首頁
- 商品分類
- 分類說明
- 分類管理
- 普通產品
- 發布商品
- 商品規格
- 商品評價
- 前臺頁面
- 產品詳情
- 產品熱門搜索
- 營銷
- 優惠券
- 發布優惠券
- 領取及使用
- 積分
- 積分設置
- 積分來源
- 積分使用
- 秒殺配置維護
- 秒殺商品維護
- 砍價管理
- 砍價規則
- 砍價活動
- 拼團管理
- 拼團規則
- 拼團活動
- 視頻號管理
- 草稿列表
- 一號通
- 商品列表
- 微信視頻號直播
- 分銷
- 分銷配置
- 分銷規則說明
- 分銷員管理
- 提現
- 傭金提現
- 發起提現
- 后臺審核
- 本地存儲
- 會員等級
- 七牛云存儲
- 等級說明
- 騰訊云存儲
- 文章管理
- 阿里云存儲
- 文章界面
- 發布文章
- 訂單管理
- 后臺訂單處理
- 訂單退款
- 訂單打印
- 賬戶管理
- 賬號信息
- 賬戶資金
- 郵費說明
- 郵費組成
- 商城運費設置
- 運費模板
- 設置
- 系統配置
- 商品采集
- 物流查詢
- 電子面單
- 短信
- 管理權限
- 身份管理
- 管理員列表
- 權限管理
- 物流配置
- 文件上傳配置
- 提貨點
- 設置提貨點
- 核銷員
- 核銷訂單
- 頁面管理
- 一鍵換色
- 頁面設計
- 第三方接口設置
- 物流查詢
- 庫存說明
- 統計管理
- 首頁看板
- 商品統計
- 用戶統計
- 交易統計
- 常見問題
- 服務器配置相關
- 寶塔redis設置密碼
- 前端項目部署在一個nginx下通過目錄訪問
- java項目常見問題
- Swagger 后臺 API 文檔
- Java項目日志
- start.sh啟動報錯
- 退款問題
- win服務出現亂碼問題
- WEB PC 管理端常見問題
- WEB PC頁面刷新和富文本上傳圖片404
- npm鏡像問題
- 測試環境微信授權彈出提示框
- 文件上傳
- 后臺管理系統登錄問題
- 后臺核銷人員通過移動端核銷訂單
- npm install github出錯暴力解決(僅限此項目)
- 運費模板查詢出錯
- 取消掉粒子效果
- 素材提供
- 移動端相關問題
- 微信開發工具上傳代碼超包
- 支付成功但訂單顯示失敗
- 移動端刷新404
- 小程序生成推二維碼失敗
- 圖片問題
- 圖片素材導入
- 一鍵換色
- 源碼問題
- 代碼怎么下載和更新
- 1.3.7更新
- 支付相關
- 商戶平臺添加支付授權目錄
- 業務常見問題
- 版權
- 移動端基本介紹
- 首頁
- 分類頁
- 個人中心
- WEB PC 管理端基本介紹
- 后臺前端目錄結構
- 前端開發配置
- 前端配置說明
- 前端添加頁面
- 前端引用組件
- 前端構建和發布
- 技術文檔
- 配置
- 目錄結構
- 項目
- Crmeb
- 移動端
- PC后臺
- 開發規范
- 數據字典
- 任務
- 組合數據
- 后臺表單說明
- 攔截器
- 過濾器
- MyBatis-Plus
- 無限級分類設計
- 分頁配置
- 必看內容
- 七牛云
- 本地存儲
- 七牛云存儲
- 騰訊云存儲
- 阿里云存儲
- 附錄
- 視頻教程
- Java 后臺程序
- WEB PC 管理端
- Uniapp 移動端
- 二開錦囊
- 集成第三方SDK
- 阿里
- 短信