程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql左右值無限分類原理及實現

mysql左右值無限分類原理及實現

編輯:MySQL綜合教程

mysql左右值無限分類原理及實現   無限分類是我們開發中非常常見的應用,我們最常見最簡單的方法就是在MySql裡id ,name,f_id。 優點是簡單,結構簡單。 缺點是效率不高,因為每一次遞歸都要查詢數據庫,幾百條數據庫時就不是很快了!
  www.2cto.com   存儲樹是一種常見的問題,多種解決方案。主要有兩種方法:鄰接表的模型,並修改樹前序遍歷算法。 我們將探討這兩種方法的節能等級的數據。我會使用樹從一個虛構的網上食品商店作為一個例子。這食品商店組織其食品類,通過顏色和類型。這棵樹看起來像這樣:
  www.2cto.com   下面我們將用另外一種方法,這就是預排序遍歷樹算法(modified preorder tree traversal algorithm) 這種方法大家可能接觸的比較少,初次使用也不像上面的方法容易理解,但是由於這種方法不使用遞歸查詢算法,有更高的查詢效率。 我們首先將多級數據按照下面的方式畫在紙上,在根節點Food的左側寫上 1 然後沿著這個樹繼續向下 在 Fruit 的左側寫上 2 然後繼續前進,沿著整個樹的邊緣給每一個節點都標上左側和右側的數字。最後一個數字是標在Food 右側的 18。 在下面的這張圖中你可以看到整個標好了數字的多級結構。(沒有看懂?用你的手指指著數字從1數到18就明白怎麼回事了。還不明白,再數一遍,注意移動你的 手指)。 這些數字標明了各個節點之間的關系,"Red"的號是3和6,它是 "Food" 1-18 的子孫節點。 同樣,我們可以看到 所有左值大於2和右值小於11的節點 都是"Fruit" 2-11 的子孫節點 如圖所示: 這樣整個樹狀結構可以通過左右值來存儲到數據庫中。繼續之前,我們看一看下面整理過的數據表。  注意:由於"left"和"right"在 SQL中有特殊的意義,所以我們需要用"lft"和"rgt"來表示左右字段。 另外這種結構中不再需要"parent"字段來表示樹狀結構。也就是 說下面這樣的表結構就足夠了。 SELECT * FROM tree WHERE lft BETWEEN 2 AND 11; 只要一個查詢就可以得到所有這些節點。為了能夠像上面的遞歸函數那樣顯示整個樹狀結構,我們還需要對這樣的查詢進行排序。用節點的左值進行排序: SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC; 那麼某個節點到底有多少子孫節點呢?很簡單,子孫總數=(右值-左值-1)/2 descendants = (right – left - 1) / 2 ,如果不是很清楚這個公式,那就去翻下書,我們在上數據結構寫的很清楚! 添加同一層次的節點的方法如下: Sql代碼 1. LOCK TABLE nested_category WRITE; 
2. 
3. 
4. SELECT @myRight := rgt FROM nested_category 
5. WHERE name = 'Cherry'; 
6. 
7. 
8. 
9. UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight; 
10. UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight; 
11. 
12. INSERT INTO nested_category(name, lft, rgt) VALUES('Strawberry', @myRight + 1, @myRight + 2); 
13. 
14. UNLOCK TABLES; 添加樹的子節點的方法如下: Sql代碼 1. LOCK TABLE nested_category WRITE; 
2. 
3. SELECT @myLeft := lft FROM nested_category 
4. 
5. WHERE name = 'Beef'; 
6. 
7. UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft ; 
8. UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft ; 
9. 
10. INSERT INTO nested_category(name, lft, rgt) VALUES('charqui', @myLeft + 1,@myLeft + 2); 
11. 
12. UNLOCK TABLES; 每次插入節點之後都可以用以下SQL進行查看驗證: Sql代碼 1. SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name 
2. FROM nested_category AS node, 
3. nested_category AS parent 
4. WHERE node.lft BETWEEN parent.lft AND parent.rgt 
5. GROUP BY node.name 
6. ORDER BY node.lft; 刪除節點的方法,稍微有點麻煩是有個中間變量,如下: Sql代碼 1. LOCK TABLE nested_category WRITE; 
2. 
3. 
4. SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1 
5. FROM nested_category 
6. WHERE name = 'Cherry'; 
7. 
8. 
9. DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight; 
10. 
11. 
12. UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight; 
13. UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight; 
14. 
15. UNLOCK TABLES; 
這種方式就是有點難的理解,但是適合數據量很大規模使用,查看所有的結構只需要兩條SQL語句就可以了,在添加節點和刪除節點的時候略顯麻煩,不過相對於效率來說還是值得的

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved