請注意:java
一、因爲是經常使用結構,因此也許早已經有相似的解決方法了。數據庫
二、本人數據庫接觸還少,如下表述可能有錯誤的地方,並且如下方法也沒通過實際運行,僅供參考。網絡
三、本文是爲了回答提問版中的一個問題:http://www.oschina.net/question/268888_152060數據結構
樹狀結構是比較廣泛使用的數據結構,好比公司部門組成。更典型的應該是傳銷成員的結構,每名會員發展下線,下線再發展下線。。。.net
因爲關係型數據庫的本質是表格結構,與樹狀結構相差較大,樹狀結構如何在關係型數據庫中保存,且能快速查詢、修改節點、統計一個節點有多少個子節點,與在內存中保存樹狀結構比起來比較糾結。code
內存中能夠用地址引用加遞歸來實現,CPU執行速度也很快,因此Z增刪改查起來速度基本還能夠接受。遞歸
但關係型數據庫,SQL遞歸比較糾結,若是把程序寫到數據庫的存儲過程當中還好,若是經過網絡鏈接進行SQL遞歸查詢,速度估計難以接受。內存
我想到的方法是建兩張表,第一張表中有id和level兩個字段,分別表示節點的id,和該節點在樹狀結構的層級io
第二張表中建level_一、level_二、level_3等字段,樹狀結構每多一層,則多加一列,每列保存相應層級的數據。table
好比樹狀結構:
a b c d e f g
則兩個表的結構以下:
表1
id | level |
a | 1 |
b | 2 |
c | 2 |
d | 3 |
e | 3 |
f | 3 |
g | 3 |
表2
level_1 | level_2 | level_3 | ... |
a | |||
a | b | ||
a | c | ||
a | b | d | |
a | b | e | |
a | c | f | |
a | c | g |
這時查詢節點a有多少子節點時,就可使用以下語句進行:
SELECT level FROM 表1 WHERE id='a'
而後好比得到的結果爲1,那再進行如下查詢
SELECT count(*) AS N FROM 表1 WHERE level_1='a'
那就能夠得到a的子節點數爲N-1,也就是6。這條語句須要程序在運行時生成,動態修改level_?中問號的值。
一樣新增和刪除也只要經過幾條條語句分別操做兩個表就能完成。
這種方式的缺點是若是樹狀層級每增長一層,就須要在第二表中新增一列,這須要額外的權限。