作者︰佚名 | 來源︰網絡 | 添加時間︰2007-03-09 15:33:15 | 人氣︰1053
一、前言
很多情況下二級分類已經不能滿足需要了,而網上可用的多級分類的例子實在是不好找,故有此文。
http://bbs.blueidea.com/viewthread.php?tid=1182243
大家可以先看這個,它介紹了一種超級好的算法,反正我是看不大懂呀。
二、我們要解決的問題︰
1、 分類算法常常表現為樹的表示和遍歷問題。那麼,請問︰如果用數據庫中的一個Table來表達樹型分類,應該有幾個字段?
2、 如何快速地從這個Table恢復出一棵樹;
3、 如何判斷某個分類是否是另一個分類的子類;
4、 如何查找某個分類的所有產品;
5、 如何生成分類所在的路徑。
6、 如何新增分類;
三、遞歸實現的優點與缺點
該怎麼實現多級分類呢?
估計首先想到的都是遞歸,實現簡單,在指定節點(就是分類,下同)下添加、修改、刪除節點都不是問題,
而且節點移動實現起來也不是很難,只是要注意移動目的父節點不能是當前節點的父節節點(等于沒移動),也不能是當前節點的子節點(類似于window文件夾,一個文件夾是不能移動到自己的字文件夾里的)。
但是最愁人的是搜索指定節點下的東西,怎麼辦?也就是上面的問題3。記住,這是要包括所有子節點的,難道還去遞歸嗎?
四、介紹下我的簡單算法(是我所用的,不是我發明的)
以常見的商品系統為例。
4.1 表結構
[1]分類表,T_Sort,表結構如圖一所示。其中sortPath保存的是節點路徑,這是個重點。
[2]商品表,T_Product,表結構如圖二所示。
[center]圖一
圖二
[/center]
4.2 算法簡要說明
[1]parentID保存的自然是節點的父節點,如果一個節點的parentID=0時,認為它是一級分類。
[2]一個節點的sortPath為它的父節點的sortPath+自己的sortID+","。如sortID=32的節點的父節點是節點21,節點21的sortPath是"0,21,",那麼節點32的sortPath就是"0,21,32,"。有點繞,看圖三清楚啦。可能你想不通為啥最後要多個逗號啊,後面你就明白啦。所有節點的sortPath的左邊兩位都是"0,",因為它們都在根節點下。一個節點的sortPath一定包含在它的子節點的sortPath中。
[center]
圖三
[/center]
4.3 代碼重點講解。
這里以我們要實現的功能為例講解。
[1]添加節點
<1>選擇父節點,可以是根節點,或是下級所有節點(最好列出一個樹型菜單讓用戶選擇,別愁,可以實現),其實就是選擇parentID。
<2>如果parentID=0,那麼上級sortPath="0,",如果parentID<>0,那麼到表T_Sort根據parentID取得上級sortPath。
<3>給T_Sort新增記錄,sortPath=上級sortPath +新記錄的sortID +","。
<4>範例代碼見圖4、圖5。其中noRecord,closeRs(),showMsg(),closeConn()都是我定義的Function或Sub,它們的功能都是顧名思義的,我就不說了。注意一下,如果你用MS SQL,代碼略有不同。我也很奇怪MS SQL時,addNew後,這個新的自動編號可以輸出,但是和字符一連接就沒有了。各位如果知道為什麼,還請相告。
……
為支持原創,其余的內容請到 http://bbs.blueidea.com/thread-1982151-1-1.html 處瀏覽 ︰)