樹狀結構在關係型數據庫中一種存儲方式

請注意: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_?中問號的值。


一樣新增和刪除也只要經過幾條條語句分別操做兩個表就能完成。


這種方式的缺點是若是樹狀層級每增長一層,就須要在第二表中新增一列,這須要額外的權限。

相關文章
相關標籤/搜索