DotNet菜鳥入門之無限極分類(一)設計篇
寫這個教程的原因,是因為,無限極分類,在許多項目中,都用得到。而對於新手來說,不是很好理解,同時,操作上也有一些誤區或者不當之處。所以我就鬥膽,拋磚引玉一下,已一個常見的後臺左側頻道樹為例子,講解一下剖析一下無限極分類的實戰操作。
既然是寫給菜鳥的,那麽我就不話結構圖了,直接文字+代碼來說明吧。
正文
無限極分類的關鍵就在於數據庫設計時,進行了父類編號的記錄,從而把所有的分類,鏈接了起來,成為一個鏈表樣式的結構。
這次我要講的無限極分類設計如下:
(圖1)
創建的表的sql語句如下,具體字段的說明見(圖1)
:
CREATE TABLE Channel(
[id] [varchar](2000) NOT NULL,
[channelName] [nvarchar](50) NOT NULL,
[linkUrl] [varchar](200) NULL,
[parentID] [varchar](2000) NOT NULL,
[childNum] [int] NOT NULL,
[orderNum] [int] NOT NULL
)
其中,約定的基類編號為C,也就是說,第一級的分類,父編號為C,第一個分類的編號為C001
它的第一個子類編號為001,也就是說,每一級子類的編號為父類編號+ 000格式的數字。
舉例如下(名稱 編號 父編號):
|-食物 C001 C
|-----蔬菜 C001001 C001
|---------白菜 C001001001 C001001
|---------蘿蔔 C001001002 C001001
|---------冬瓜 C001001003 C001001
|-----水果 C001002 C001
|---------蘋果 C001002001 C001002
|---------橘子 C001002002 C001002
說明:
這樣設計的優點:
1)只要知道這個分類的編號,那麽去掉後三位,就是此類的父類編號。例如,食物這個類別,代碼是C001,那麽去掉後三位,他的父編號就是C,而蔬菜這個類別,代碼是C001001,去掉後三位,他的父類編號就是C001.
如此,只要知道了一個分類的編號後,就不用再去查詢數據庫,找他的父類編號了。可以直接用程序算出,他的父類編號。
2)方便的知道這個類別的深度,也就是幾級分類。算法就是——(分類編號長度-1)/3。
例如,食物這個分類的編號為 C001,那麽他的分類級別為: (4-1)/3 = 1。
那麽蔬菜這個分類的級別就是: (7-1)/3 = 2。為2級分類。
3)可以程序直接算出所有的父類,省去了遞歸的過程。
例如冬瓜這個分類,循環去掉三位後,得到他的父類編號依次為:
C001001 、 C001 、 C
設計的缺點:
1)主鍵不是數字類性,相對數字為主鍵的索引來說,速度稍慢,不過好在數據不會太多。
2)擴展性不是很好,可以看出,這個無限極分類,同級別的分類最多只能分到999級別,即C001到C999,如果你想更多,那麽可以設定為 C0001到C9999即9999個同類級別。不過一般說是無限極分類,但是999的同級別,一般情況下,就夠用了。
主要還是看需求來指定,是否是使用數字為主鍵和父類編號的分類,還是用字符的。
提示:如果使用數字作為主鍵和父類編號,那麽需要增加一個path路徑字段,用來記錄級別的路徑記錄。
此種無限極分類的設計,就介紹到這裏了。下一篇文章,寫一下這種設計的操作及相關代碼
DotNet菜鳥入門之無限極分類(一)設計篇