常用無限極分類
原文1:
http://www.cnblogs.com/jeffwongishandsome/archive/2010/10/26/1861633.html
1、資料表設計
開門見山,Category表設計如下:
資料表字段簡單說明:
列名 | 資料型別 | 預設值 | 備註 |
Id | int | 自增主鍵 | |
Name | varchar(256) | 分類類別名稱 | |
ParentId | int | 0 | 父母分類Id |
Depth | int | 1 | 深度,從1遞增 |
Status | int | 0 | 狀態:0禁用,1啟用 |
Priority | int | 0 | 優先順序,越大,同級顯示的時候越靠前 |
說明:在設計實現這個資料表之前,我搜索參考並比較了一下其他無限層級設計方案,比如
2、簡單查詢
(1)通常,在實際應用中簡單查詢某一級別可用(Status等於1)的分類非常簡單:
1 2 3 4 5 6 7 8 |
SELECT [Id]
,[ Name ]
,[ParentId]
,[Depth]
,[Status]
,[Priority]
FROM [Category](NOLOCK)
WHERE Status=1
AND Depth=n
--n>=1
|
最後按照優先順序(Priority)欄位逆序即可。
地址:http://www.cnblogs.com/yhb199/archive/2008/07/01/1233153.html
網站大規模分類 比較三種分類的資料庫設計
原文3:
地址:http://www.cnblogs.com/cathsfz/archive/2006/12/12/589464.html
Answer
通常在設計表示樹結構的資料表時,我們會增加兩個欄位:
- Depth - 表示當前節點的深度的整數
- Path - 表示從根節點到當前節點的路徑的字串,採用節點名稱不可能出現的字元作為分隔符
在對樹進行操作時,我們還是如平常一樣對錶執行CRUD操作,要維護這兩個欄位並不需要費多少力氣,然而在查詢時卻會為我們帶來極大的便利。例如要查詢第3層的節點,則只需要使用"WHERE Depth = 3"
這樣做的道理就在於,通過增加冗餘資訊來提高檢索速度,同時這些冗餘資訊非常容易維護所以不容易因為操作不慎而導致資訊不一致。設想一下你要對樹增加/移動/刪除一個節點,原本一條SQL語句就能完成的事情現在還是一條SQL語句就能完成,就算不依賴事務也絕對不會導致資訊不一致。
明白了這個道理,我們就可以進行推廣,例如我們既可能需要根據Id欄位的路徑來查詢,又可能需要根據Name欄位的路徑來查詢,那就分開IdPath和NamePath兩個欄位來表示兩組路徑字串。