本發(fā)明屬于數(shù)據(jù)處理技術(shù)領域,具體涉及一種實現(xiàn)快速查詢樹形結(jié)構(gòu)數(shù)據(jù)指定節(jié)點下級的方法。
背景技術(shù):
業(yè)務系統(tǒng)中,經(jīng)常會遇到樹狀結(jié)構(gòu)數(shù)據(jù),如組織機構(gòu)樹、產(chǎn)品分類等,這種樹形結(jié)構(gòu)數(shù)據(jù)在數(shù)據(jù)表中存儲時,通常會將每個節(jié)點作為一條記錄存儲,每條記錄通常包括節(jié)點ID、節(jié)點名稱、上級節(jié)點ID等字段,需要查詢某個節(jié)點的所有下級節(jié)點時,通常會采用遞歸查詢的方式,然而當節(jié)點數(shù)較多,樹層級較深時,遞歸查詢性能會非常的差;采用構(gòu)建、存儲每個節(jié)點的所有上級節(jié)點ID全路徑的方式,雖能夠快速查詢出指定節(jié)點的所有下級節(jié)點解決遞歸查詢性能差的問題,但要依賴高級程序來維護路徑中的字符串,并且驗證字符串的正確性的開銷很大,字符串的長度很難確定,無論字符串的長度設為多大,都存在不能夠無限擴展的情況。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于,針對上述遞歸查詢性能差,存儲路徑方式需要高級程序維護字符串及字符串長度難確定的缺陷,提供一種實現(xiàn)快速查詢樹形結(jié)構(gòu)數(shù)據(jù)指定節(jié)點下級的方法,以解決上述技術(shù)問題。
為實現(xiàn)上述目的,本發(fā)明給出以下技術(shù)方案:
一種實現(xiàn)快速查詢樹形結(jié)構(gòu)數(shù)據(jù)指定節(jié)點下級的方法, 包括如下步驟:
S1.將樹形結(jié)構(gòu)數(shù)據(jù)以深度優(yōu)先遍歷法中的先序遍歷順序存儲到一張關系型數(shù)據(jù)庫表中,數(shù)據(jù)庫表字段包括序列號、節(jié)點ID和深度等級,節(jié)點ID是主鍵,每個節(jié)點ID取不同的值;
S2.輸入指定節(jié)點ID,判斷出要查詢的該指定節(jié)點ID的所有下級節(jié)點ID,步驟如下:
S21.設定要查詢的指定節(jié)點ID對應的序列號為N,對應的深度等級為L;
S22.設定要查詢的所有下級節(jié)點ID對應的序列號范圍為N1-N2,沿著序列號N升序的方向在數(shù)據(jù)庫表中查詢深度等級,設定為L′;
當L′≤L時,查詢停止,L′對應的序列號設定為N′,N<N1,N2< N′;
若查詢到結(jié)束,L′始終大于L,則數(shù)據(jù)庫表最后一行的序列號設定為N′,N<N1,N2≤ N′;
N1和N2之間的所有序列號對應的節(jié)點ID為要查詢的節(jié)點ID。
進一步地,步驟S1所述的深度優(yōu)先遍歷法是沿著樹的深度遍歷樹的節(jié)點,盡可能深的搜索樹的分支,每個節(jié)點只訪問一次;先序遍歷順序是對任一子樹,先訪問根,其次遍歷其左子樹,最后遍歷其右子樹。
進一步地,步驟S1中的關系型數(shù)據(jù)庫表中還包括節(jié)點名稱、上級節(jié)點ID。
進一步地,步驟S1中節(jié)點ID值長度相等。
進一步地,增加節(jié)點時,在數(shù)據(jù)庫表格中增加對應的行,從增加的節(jié)點往下的所有節(jié)點對應序列號+1, 增加的節(jié)點有下級子節(jié)點時, 同時所有子節(jié)點的深度等級+1;刪除節(jié)點時,在數(shù)據(jù)庫表格中刪除對應的行,從刪除的節(jié)點往下的所有節(jié)點對應序列號-1,刪除的節(jié)點有下級子節(jié)點時, 同時所有子節(jié)點的深度等級-1。
進一步地,變更節(jié)點上下級關系時,在數(shù)據(jù)庫表格中按先刪除后增加的方式變更序列號和深度等級。
進一步地,步驟S2中指定節(jié)點的所有下級節(jié)點的查詢采用SQL語句。
本發(fā)明的有益效果在于:本發(fā)明是樹形結(jié)構(gòu)數(shù)據(jù)快速查詢某個節(jié)點的所有下級節(jié)點的一種解決方案,是傳統(tǒng)遞歸查詢和路徑存儲方式的一種有效替代方案,尤其在樹節(jié)點數(shù)較多,層級較深時,優(yōu)勢更加明顯,而且解決路徑存儲方式需要高級程序維護字符串及字符串長度難確定的缺陷,能很好的應用于組織機構(gòu)樹、產(chǎn)品分類樹等實際業(yè)務場景中。
此外,本發(fā)明設計原理可靠,結(jié)構(gòu)簡單,具有非常廣泛的應用前景。
由此可見,本發(fā)明與現(xiàn)有技術(shù)相比,具有突出的實質(zhì)性特點和顯著的進步,其實施的有益效果也是顯而易見的。
附圖說明
圖1為實施例1樹形結(jié)構(gòu)圖;
圖2為實施例1樹形結(jié)構(gòu)存儲到關系型數(shù)據(jù)庫表格中的圖;
圖3為實施例2增加節(jié)點時的樹形結(jié)構(gòu)圖;
圖4為實施例2增加節(jié)點時的關系型數(shù)據(jù)庫表格的變化示意圖;
圖5為實施例3變更節(jié)點關系時的樹形結(jié)構(gòu)圖;
圖6為實施例3變更節(jié)點關系時的關系型數(shù)據(jù)庫表格的變化示意圖。
具體實施方式:
為使得本發(fā)明的目的、特征、優(yōu)點能夠更加的明顯和易懂,下面將結(jié)合本發(fā)明具體實施例中的附圖,對本發(fā)明中的技術(shù)方案進行清楚、完整地描述。
本發(fā)明提供一種實現(xiàn)快速查詢樹形結(jié)構(gòu)數(shù)據(jù)指定節(jié)點下級的方法,實施例1如圖1和圖2所示,包括如下步驟:
S1.將圖1所示的樹形結(jié)構(gòu)數(shù)據(jù)以深度優(yōu)先遍歷法中的先序遍歷順序存儲到圖2所示關系型數(shù)據(jù)庫表中,數(shù)據(jù)表字段包括序列號、節(jié)點ID和深度等級,節(jié)點ID是主鍵,每個節(jié)點ID取不同的值; 深度優(yōu)先遍歷法中的先序遍歷順序為從根節(jié)點root依次到節(jié)點n0001,n0003,n0004,n0002,n0005,n0006;
如要查詢n0001的所有下級節(jié)點,查詢可采用SQL語句,
S2.要查詢節(jié)點n0001的所有下級節(jié)點, 判斷出節(jié)點n0001的所有下級節(jié)點ID, 步驟如下:
S21.查到n0001對應的序列號N為2, 對應的深度等級L為2;
S22.設定要查詢的所有下級節(jié)點ID對應的序列號范圍為N1-N2,沿著序列號2升序的方向在數(shù)據(jù)庫表中查詢深度等級,設定為L′;
當L′=2時,查詢停止,L′對應的序列號N′=5,2<N1,N2< 5;
2和5之間的所有序列號對節(jié)點ID為要查詢的節(jié)點ID,即序列號3對應的n0003和序列號4對應的n0004為要查詢的節(jié)點ID。
若要查詢n0002的所有下級節(jié)點,查詢可采用SQL語句,
S2.要查詢節(jié)點n0002的所有下級節(jié)點, 判斷出節(jié)點n0002的所有下級節(jié)點ID, 步驟如下:
S21.查到n0002對應的序列號N為5, 對應的深度等級L為2;
S22.設定要查詢的所有下級節(jié)點ID對應的序列號范圍為N1-N2,沿著序列號5升序的方向在數(shù)據(jù)庫表中查詢深度等級,設定為L′;
查詢到結(jié)束,L′始終大于2,則數(shù)據(jù)庫表最后一行的序列號7設定為N′,5<N1,N2≤ 7;
5和7之間的所有序列號對節(jié)點ID為要查詢的節(jié)點ID,即序列號6對應的n0005和序列號7對應的n0006為要查詢的節(jié)點ID。
實施例2如圖3和圖4所示,增加節(jié)點n0008,n0008增加的位置在節(jié)點n0003和n004之間,在數(shù)據(jù)庫表格中增加對應的行,從增加節(jié)點n0008往下的所有節(jié)點對應序列號+1。
實施例3如圖5和圖6所示,變更節(jié)點上下級關系時,按先刪除后增加的方式變更序列號和深度等級,將n0001的下級節(jié)點n0004變更成n0001的上級節(jié)點,如圖5所示,在數(shù)據(jù)庫表格中按先刪除n0001的子節(jié)點n0004,再增加n0001的上級節(jié)點n0004的方式變更序列號和深度等級,具體如圖6所示:
刪除節(jié)點n0004,n0004刪除的位置在節(jié)點n0003之后,在數(shù)據(jù)庫表格中刪除對應的行,從刪除的節(jié)點n0004往下的所有節(jié)點對應序列號-1;
再增加節(jié)點n0004,n0004增加的位置在根節(jié)點root和n0001之間,在數(shù)據(jù)庫表格中增加對應的行,從增加的節(jié)點n0004往下的所有節(jié)點對應序列號+1,增加的節(jié)點n0004有下級子節(jié)點n0001,n0003, 同時n0001,n0003的深度等級+1。
本發(fā)明的實施例是說明性的,而非限定性的,上述實施例只是幫助理解本發(fā)明,因此本發(fā)明不限于具體實施方式中所述的實施例,凡是由本領域技術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出的其他的具體實施方式,同樣屬于本發(fā)明保護的范圍。