今天來介紹把樹形結構存入數據庫的第二種方法——路徑枚舉法。數據庫
仍是借用上一篇的栗子,爲了方便你們查閱,我把圖又原樣搬過來了。spa
須要回答的問題依舊是這樣幾個:code
1.查詢小天的直接上司。blog
2.查詢老宋管理下的直屬員工。字符串
3.查詢小天的全部上司。字符串處理
4.查詢老王管理的全部員工。it
方案2、 Path Enumeration 路徑枚舉法,記錄下根節點到每一個子節點的路徑。io
先建立表:class
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值設置的越大,浪費的空間就越多。
至此,本篇介紹完畢,以後還會介紹其餘方法,歡迎你們繼續關注!