1. 程式人生 > >常用無限極分類

常用無限極分類

原文1:

http://www.cnblogs.com/jeffwongishandsome/archive/2010/10/26/1861633.html

1、資料表設計

開門見山,Category表設計如下:

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)欄位逆序即可。

原文2:

地址: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"

;又例如要查詢A1節點下B3節點下C2節點下的所有子節點,則可以使用"WHERE Path LIKE 'A1/B3/C2%'"

這樣做的道理就在於,通過增加冗餘資訊來提高檢索速度,同時這些冗餘資訊非常容易維護所以不容易因為操作不慎而導致資訊不一致。設想一下你要對樹增加/移動/刪除一個節點,原本一條SQL語句就能完成的事情現在還是一條SQL語句就能完成,就算不依賴事務也絕對不會導致資訊不一致。

明白了這個道理,我們就可以進行推廣,例如我們既可能需要根據Id欄位的路徑來查詢,又可能需要根據Name欄位的路徑來查詢,那就分開IdPath和NamePath兩個欄位來表示兩組路徑字串。