【MySQL疑難雜症】如何將樹形結構存儲在數據庫中(方案二 Path Enumeration)


  今天來介紹把樹形結構存入數據庫的第二種方法——路徑枚舉法。

  還是借用上一篇的栗子,為了方便大家查閱,我把圖又原樣搬過來了。

  需要回答的問題依舊是這樣幾個:

  1.查詢小天的直接上司。

  2.查詢老宋管理下的直屬員工。

  3.查詢小天的所有上司。

  4.查詢老王管理的所有員工。

方案二、 Path Enumeration 路徑枚舉法,記錄下根節點到每個子節點的路徑。

  先創建表:

CREATE TABLE employees2(
eid INT,
ename VARCHAR(100),
position VARCHAR(100),
path VARCHAR(200)
)

  然后插入數據:

  現在我們來回答一下之前的問題:

  1.查詢小天的直接上司。

  在上一個解決方案中能輕而易舉做到的事情,在這個方案中卻有些麻煩了,因為需要對path字段進行字符串處理,去掉“/”+自身id才是直接上司的path值。又開始一頓騷操作:

  SELECT e1.eid,e1.ename FROM employees2 e1,employees2 e2 WHERE e2.ename = '小天' AND e1.path = REPLACE(e2.path,CONCAT('/',e2.eid),'');

  好像這個操作還不夠sao,2333,結果如下:

  

  2.查詢老宋管理下的直屬員工。

  怎么查管理下的直屬員工呢?那就要用模糊查詢了:

  SELECT e2.eid,e2.ename FROM employees2 e1,employees2 e2 WHERE e1.ename = '老宋' AND e2.path REGEXP CONCAT(e1.path,'/[0-9]{1,}$');

  這里用了正則匹配,匹配所有path符合規則的記錄,結果如下:

  

  3.查詢小天的所有上司。

  SELECT e1.eid,e1.ename FROM employees2 e1,employees2 e2 WHERE e2.ename='小天' AND e2.path like concat(e1.path,'/%');

  這里就能體現這種存儲結構的優勢了。不看效率的話,還是很方便的。

  

  4.查詢老王管理的所有員工。

  SELECT e2.eid,e2.ename FROM employees2 e1,employees2 e2 WHERE e1.ename='老王' AND e2.path like concat(e1.path,'/%');

  看吧,查起來就so easy了。

  

  不用像之前那樣寫一大段存儲過程了,簡單粗暴。

  小結一下,存儲路徑的方式在進行多級查詢的時候十分方便,而在查詢直接上下級的時候稍微復雜一點。還有一個很明顯的缺點,那就是path的大小是指定的,所以理論上是不能進行無限層級的存儲的,path值設置的越大,浪費的空間就越多。

  至此,本篇介紹完畢,之后還會介紹其他方法,歡迎大家繼續關注!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM