好大一棵樹,新春的祝福(一):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、不能使用“編號”作為主、外來鍵進行多表關聯。因為一旦功能結構(或者組織結構)發生了變化,那麼就意味著這個“編號”也會隨之發生變化,如果使用主鍵進行關聯的話,那可是一件很恐怖的事情。
針對這些缺點進行了一下改進,改進結果就是我的樹的結構了。
下一篇將詳細說明我的樹的資料結構和頁面的展現。