一、樹形結構例子分析: 以360問答頁面為例:http://wenda.so.com/c/ 我們通過觀察URL,可以明確該頁面的數據以樹形結構存儲,下麵三塊模塊分別為: ①根節點 ②根節點的第一層子節點 ③為左側所選擇節點的下一層子節點 (圖1) 該例簡化的樹形結構圖如下: (圖2) 我們不難發現, ...
一、樹形結構例子分析:
以360問答頁面為例:http://wenda.so.com/c/
我們通過觀察URL,可以明確該頁面的數據以樹形結構存儲,下麵三塊模塊分別為:
①根節點
②根節點的第一層子節點
③為左側所選擇節點的下一層子節點
(圖1)
該例簡化的樹形結構圖如下:
(圖2)
我們不難發現,每當點擊圖1紅框內的類別時,頁面主體問題部分會顯示該類別節點下所有子節點的問題。因此,需要實現查詢出某節點所有子節點的功能。
二、表的存儲:
需要存儲兩張表:
1、類別表
create table [QType] ( QID int not null primary key, QPID int not null, QPath varchar(max) not null, QTypeContent varchar(max) not null )
·路徑欄位的添加方法:找到父節點的Path +“,”+自身的ID 即可。
2、問題表
create table QContent ( ContentID int not null primary key, TypeID int not null, Content varchar(max) not null )
·問題表的TypeID即為類別表的QID
三、表的查詢
//查詢出某ID的所有子節點(包含自身) select * from QType where CHARINDEX((select QPath from QType where QID=參數),QPath)>0
CHARINDEX函數說明:CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
通過CHARINDEX如果能夠找到對應的字元串,則返回該字元串位置,否則返回0。因此當其>0時表示能在路徑中找到相應字元串,即可查詢到自身以及子節點。
例如:
//查找出以2為ID節點的所有子節點(包含自身) select * from QType where CHARINDEX((select QPath from QType where QID=2),QPath)>0
查詢結果:
因此,實現以上功能(即點擊類別找到相應問題顯示),則為:
select QContent.Content from QContent where QContent.TypeID IN (select QType.QID from QType where CHARINDEX((select QType.QPath from QType where QID=參數),QPath)>0)
四、總結
通過新增一個路徑欄位的方法,可以無需使用遞歸,有效提高效率。
正在學習中,歡迎大家指出問題&相互交流!