利用數據庫表構造無限級分類,通常我們會采用下面這種方式
這種主子關系結構清晰,但查詢時會有一些小問題;查詢當前類別的所有子類及子類下的子孫類,會出現遞歸查詢,而實際應用中這種查詢是很常見的,比如我們要查詢所有技術類文章信息;
解決這類問題在SqlServer2005出現之前通常是采用游標來操作,但熟悉數據庫內部機制的人都知道使用游標帶來的性能問題和其他問題是比較嚴重的
到了SqlServer2005下,可以選擇用CTE來做遞歸查詢,例如要查詢所有技術類文章,就可使用這種方式,向上遞歸和向下遞歸基本實現方式是基本一致的
/*查詢所有"技術類文章"類別及其子孫類*/
WITH T_Category(id,name,parentid) as
(
SELECT CategoryID,CategoryName,ParentId FROM Category WHERE CategoryID=3
UNION ALL
SELECT A.CategoryID,A.CategoryName, A.ParentID FROM Category A ,T_Category B where A.ParentId=B.id
)
SELECT * FROM T_Category
這種方式查詢比較簡練,但由於數據庫內部是采用遞歸查詢的方式,其效率依舊不高;
為了能夠實現既簡練又高效的查詢,通常的做法是增加冗余字段,比如增加一個"Path"字段:
查詢時用模糊查詢來進行左匹配,如查詢所有文章類別時這樣寫, Select * from SiteCategory where path like ‘文章%'
對Path建索引後,這種查詢的效率還是相當高的,因此這種方式也是一種常規的設計方式;
下面介紹另一種設計方式,利用SqlServer2008中的Hierarchyid字段類型來構造這種結構;
創建一客戶地區信息表“Customer”,結構如下