MySQL樹形結構設計
樹形資料舉例
表名t_manage_group,資料示例如下:
id | pid | path | node_name | node_type | node_val |
---|---|---|---|---|---|
1 | / | 公司 | 2 | 2001 | |
2 | 1 | /1/ | 王某公司 | 2 | 2002 |
3 | 2 | /1/2 | 王XX負責人 | 3 | 3001 |
4 | / | 郫縣打樣店鋪 | 2 | 2003 | |
5 | 4 | /4/ | 李XX店長 | 3 | 3002 |
6 | 4 | /4/ | 值班人員1 | 3 | 3003 |
7 | / | 代理商負責 | 1 | ||
8 | 7 | /7/ | 代理商 | 2 | 2008 |
9 | 8 | /7/8/ | XX公司 | 1 | |
10 | 9 | /7/8/9/ | 張XX業務員 | 2 | 2010 |
欄位說明:
- id:當前記錄的id
- pid:當前記錄的上級id(parent id的縮寫)。
- path:當前記錄的路徑(由id通過斜槓分隔組成,如:/1/2/)
- node_name: 當前記錄的名稱 。
- node_type: 當前記錄中node_val的型別:1,僅名稱(不需引用其它表);2,公司(node_val是其它表的id);3,人員(node_val是其它表的id)。
- node_val: 當前記錄需要關聯到其它表時,使用的id。
--查詢某個節點的直接下級,pid=xx就是id=xx的直接下級
select * from t_manage_group where pid=xx;
--查詢某個節點的所有下級
select * from t_manage_group where path like "/xx/xx/%";
--查詢某個節點的所有上級
select * from t_manage_group where path like "%/xx/xx/";
--查詢某個節點的直接下級,並且型別為業務員(node_type=2)
select * from t_manage_group where pid=xx and node_type=2;
為什麼這樣設計
- 頂層節點沒有父節點id,填什麼呢?不填,留空。
- 頂層節點的路徑(path),填什麼?填“/”。
- 有了pid欄位,為什麼還要路徑(path)欄位?用path欄位,是為了方便查詢某個節點的,所有直接上級或所有直接下級。
- 路徑(path)欄位,為什麼設計成以”/“開始也以”/“結尾?舉個例就明白了:如果不以”/“結尾,查詢”/1/10”,結果”/1/1000”也會被命中,因為前面部分是一樣的。
- 這種樹形結構設計單獨用一張表,這樣有什麼好處?這樣的好處是,要用樹形時,加一張表,不用時去掉這張表,不影響其它功能。
- 網上有很多樹形結構,直接用id和pid來實現,沒有用path,我加了path是為什麼?為了直接使用path來找出上下級關係,資料庫語句簡單易懂,詳見上在的sql查詢示例。
本作品採用《CC 協議》,轉載必須註明作者和本文連結