web的一些設計

LLSS發表於2020-09-17

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 協議》,轉載必須註明作者和本文連結

相關文章