1. 程式人生 > 其它 >好大一棵樹,新春的祝福(一):n級分類的資料結構

好大一棵樹,新春的祝福(一):n級分類的資料結構

     這個樹的結構幾年前在csdn裡面也發過了一次,現在看看,主體結構居然沒有什麼變化,用了這麼長的時間,自我感覺還是很好用的。而且在這個基礎之上把其他的功能也都給聯絡起來了,比如“通用許可權”、配置資訊等。對,許可權是和這個有很大關係的,不過這種關係並不是大家想的“緊耦合”,具體是什麼關係呢,待我慢慢講來,o(∩_∩)o...。

     由於我喜歡使用資料庫,所以呢,這裡就以資料庫為主來說明。

1、基本的n級分類的結構。

     樹,本身就是一個n級分類,所以呢還是先從這個說起。n級分類,一般會想到這樣的表結構

【Test_Tree的截圖】

     本來有三個欄位(id,title,parentID)就夠用了,但是如果只有這三個欄位的話,在使用起來會有一些麻煩,所以呢大家會在這個基礎之上加一些輔助欄位,嚴格來說後加的欄位大多都屬於“冗餘”欄位,但是有時候“冗餘”也是很有必要的。

2、增加一個“編號”

     拿上面的例子來說,可以加一個“編號”,比如“樹狀結構的演示”叫做“01”,他的第一個子節點“ 基本的n級分類”叫做“0101”,第二個子子節點“加一個‘編號’”叫做“0102”。如下圖。

優點:增加的這個“編號”可以實現很多的功能,

     a、[編號的長度 / 2] 表示節點的“深度”(也就是第幾級節點),

     b、[編號]去掉最後兩位,表示該節點的父節點ID,同時也可以做一個迴圈,一直找到根節點。

     c、order by 編號 ,可以對整個樹進行排序,而這個排序又和數的結構是相一致的。

【order by code 的效果】

     把這些結合起來可以達到一個效果,那就是可以使用一個SQL語句來得到一個有縮排效果的記錄集,可以用這個記錄集直接繫結DropDownList控制元件。這樣就避免了遞迴。

     為了便於呼叫,我們可以建立一個檢視,比如叫做 V_Test_Tree2 ,如下圖

SELECT TOP 100 PERCENT NoteID, Code,
    REPLACE(SPACE(LEN(Code) / 2 - 1), ' ', ' ') 
      + NoteTitle AS NoteTitle
FROM dbo.Test_Tree
ORDER BY Code

     思路:

     先用 SPACE 函式 根據 code 的長度得到相應的空格,由於這個空格是半形的,在下拉列表框的item裡面半形空格是不能夠被顯示出來的,所以呢需要使用replace函式把半形控制元件替換成全形空格,以達到站位的效果。

繫結後的效果是這樣的。

樹狀結構的演示 基本的n級分類 加一個“編號”  我的樹功能演示 新聞管理 員工管理

【下拉列表框的演示】

     缺點:      a、有容量限制,上面的例子,每一級裡面只能有99個節點,多了就不好顯示了。雖然說一般99個也就夠用了,但是如果出現例外了怎麼辦呢?可以增加位數,變成3位的。但是修改起來並不是很容易。

     b、不能使用“編號”作為主、外來鍵進行多表關聯。因為一旦功能結構(或者組織結構)發生了變化,那麼就意味著這個“編號”也會隨之發生變化,如果使用主鍵進行關聯的話,那可是一件很恐怖的事情。

針對這些缺點進行了一下改進,改進結果就是我的樹的結構了。

下一篇將詳細說明我的樹的資料結構和頁面的展現。