1. 程式人生 > >樹形結構表的存儲【轉自:https://www.cnblogs.com/Tjna/p/9026980.html】

樹形結構表的存儲【轉自:https://www.cnblogs.com/Tjna/p/9026980.html】

png 父節點 代碼 qpid earch 模塊 tle info sea

一、樹形結構例子分析:

以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)

四、總結

通過新增一個路徑字段的方法,可以無需使用遞歸,有效提高效率。

正在學習中,歡迎大家指出問題&相互交流!

樹形結構表的存儲【轉自:https://www.cnblogs.com/Tjna/p/9026980.html】