基于普通數(shù)據(jù)庫的樹型結(jié)構(gòu)表的存儲與查詢技術(shù)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種適用于普通數(shù)據(jù)庫的有關(guān)樹型結(jié)構(gòu)數(shù)據(jù)表的節(jié)點(diǎn)數(shù)據(jù)的存儲與查詢方法及系統(tǒng)。屬于信息技術(shù)領(lǐng)域。
【背景技術(shù)】
[0002]隨著信息技術(shù)的發(fā)展,計(jì)算機(jī)網(wǎng)絡(luò)中帶數(shù)據(jù)庫的信息技術(shù)應(yīng)用到了各行各業(yè),由于數(shù)據(jù)的復(fù)雜性,很多數(shù)據(jù)庫中的數(shù)據(jù)采用樹型結(jié)構(gòu)數(shù)據(jù)表進(jìn)行存儲與查詢,而在某些情況下,當(dāng)樹型結(jié)構(gòu)數(shù)據(jù)量大,層級較深時,對數(shù)據(jù)庫中的數(shù)據(jù)檢索的效率就很難得到保證?,F(xiàn)有技術(shù)中,很多數(shù)據(jù)庫系統(tǒng)都是從業(yè)務(wù)上進(jìn)行控制,如采用固定數(shù)的深度或一次性只查詢出一級節(jié)點(diǎn),而不是所有子節(jié)點(diǎn),一般的獲取所有子節(jié)點(diǎn)都是使用遞歸的算法,當(dāng)層級較深時,系統(tǒng)中將占用較多的資源,或者計(jì)算機(jī)系統(tǒng)沒有足夠的內(nèi)存將無法計(jì)算獲取所有子節(jié)點(diǎn)。而本發(fā)明就是基于對有關(guān)樹型結(jié)構(gòu)數(shù)據(jù)的存儲進(jìn)行優(yōu)化,把樹型結(jié)構(gòu)變?yōu)楸馄浇Y(jié)構(gòu),從而提聞節(jié)點(diǎn)的檢索效率。
【發(fā)明內(nèi)容】
[0003]本發(fā)明的目的是解決普通數(shù)據(jù)庫下檢索樹形結(jié)構(gòu)數(shù)據(jù)表中的節(jié)點(diǎn)的效率問題。本發(fā)明的技術(shù)方案如下:
一種數(shù)據(jù)庫中快速查詢節(jié)點(diǎn)的方法,包括步驟:
1)在數(shù)據(jù)庫中預(yù)先存儲樹型結(jié)構(gòu)數(shù)據(jù)表,所述樹型結(jié)構(gòu)數(shù)據(jù)表中包括多個節(jié)點(diǎn),每個節(jié)點(diǎn)包含左邊界字段,右邊界字段,父節(jié)點(diǎn)id和節(jié)點(diǎn)id字段四個屬性;其中,每個節(jié)點(diǎn)的左邊界值小于右邊界值;且左、右邊界值均為正整數(shù);
2)為樹型結(jié)構(gòu)數(shù)據(jù)表的左、右邊界以及父節(jié)點(diǎn)添加索引。
[0004]3)設(shè)置與樹型結(jié)構(gòu)數(shù)據(jù)表相關(guān)的插入觸發(fā)器、刪除觸發(fā)器、修改觸發(fā)器;所述插入觸發(fā)器、刪除觸發(fā)器、修改觸發(fā)器分別用于向樹型結(jié)構(gòu)數(shù)據(jù)表中插入節(jié)點(diǎn),刪除節(jié)點(diǎn),修改節(jié)點(diǎn);
4)當(dāng)需要查詢某節(jié)點(diǎn)的所有子節(jié)點(diǎn)時,在樹型結(jié)構(gòu)數(shù)據(jù)表中檢索左、右邊界值在待查詢節(jié)點(diǎn)的左、右邊界值之間的所有節(jié)點(diǎn),并記錄所檢索到的節(jié)點(diǎn)id,所述id對應(yīng)的節(jié)點(diǎn)即待查詢節(jié)點(diǎn)的子節(jié)點(diǎn);
5)當(dāng)需要查找某節(jié)點(diǎn)的所有父節(jié)點(diǎn)時,只需要在樹型結(jié)構(gòu)數(shù)據(jù)表中篩選出左、右邊界值范圍包括待查找節(jié)點(diǎn)的左、右邊界值的所有節(jié)點(diǎn)即可。
[0005]本申請中還公開了一種快速查詢節(jié)點(diǎn)的系統(tǒng),具體包括以下模塊:
樹型結(jié)構(gòu)數(shù)據(jù)表存儲模塊,用于在數(shù)據(jù)庫中預(yù)先存儲樹型結(jié)構(gòu)數(shù)據(jù)表,所述樹型結(jié)構(gòu)數(shù)據(jù)表中包括多個節(jié)點(diǎn),每個節(jié)點(diǎn)包含左邊界字段,右邊界字段,父節(jié)點(diǎn)id和節(jié)點(diǎn)id字段四個屬性;其中,每個節(jié)點(diǎn)的左邊界值小于右邊界值;且左、右邊界值均為正整數(shù);
索引模塊,用于為樹型結(jié)構(gòu)數(shù)據(jù)表的左、右邊界以及父節(jié)點(diǎn)添加索引。
[0006]設(shè)置模塊,用于設(shè)置與樹型結(jié)構(gòu)數(shù)據(jù)表相關(guān)的插入觸發(fā)器、刪除觸發(fā)器、修改觸發(fā)器;所述插入觸發(fā)器、刪除觸發(fā)器、修改觸發(fā)器分別用于向樹型結(jié)構(gòu)數(shù)據(jù)表中插入節(jié)點(diǎn),刪除節(jié)點(diǎn),修改節(jié)點(diǎn);
子節(jié)點(diǎn)查詢模塊,用于當(dāng)需要查詢某節(jié)點(diǎn)的所有子節(jié)點(diǎn)時,在樹型結(jié)構(gòu)數(shù)據(jù)表中檢索左、右邊界值在待查詢節(jié)點(diǎn)的左、右邊界值之間的所有節(jié)點(diǎn),并記錄所檢索到的節(jié)點(diǎn)id,所述id對應(yīng)的節(jié)點(diǎn)即待查詢節(jié)點(diǎn)的子節(jié)點(diǎn);
父節(jié)點(diǎn)查詢模塊,用于當(dāng)需要查找某節(jié)點(diǎn)的所有父節(jié)點(diǎn)時,只需要在樹型結(jié)構(gòu)數(shù)據(jù)表中篩選出左、右邊界值范圍包括待查找節(jié)點(diǎn)的左、右邊界值的所有節(jié)點(diǎn)即可。
[0007]本發(fā)明通過對有關(guān)樹型結(jié)構(gòu)數(shù)據(jù)表的節(jié)點(diǎn)數(shù)據(jù)的存儲、插入、刪除及修改進(jìn)行優(yōu)化,在節(jié)點(diǎn)中增加左邊界字段及右邊界字段,把樹型結(jié)構(gòu)變?yōu)楸馄浇Y(jié)構(gòu),從而提高檢索節(jié)點(diǎn)效率。
【附圖說明】
[0008]圖1為節(jié)點(diǎn)模型圖;
圖2為節(jié)點(diǎn)添加圖;
圖3為節(jié)點(diǎn)刪除圖;
圖4為節(jié)點(diǎn)位置修改圖;
圖5為節(jié)點(diǎn)查詢圖。
【具體實(shí)施方式】
[0009]為解決數(shù)據(jù)庫中樹型結(jié)構(gòu)數(shù)據(jù)表中對節(jié)點(diǎn)的檢索查詢效率問題,本發(fā)明對計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)普通數(shù)據(jù)庫中樹型結(jié)構(gòu)數(shù)據(jù)表中節(jié)點(diǎn)數(shù)據(jù)的存儲與查詢方法進(jìn)行了優(yōu)化,【具體實(shí)施方式】如下:
在數(shù)據(jù)庫系統(tǒng)中設(shè)定節(jié)點(diǎn)的存儲方式,為每個節(jié)點(diǎn)添加兩個屬性,即左邊界與右邊界,該兩個屬性值分別對應(yīng)一個正整數(shù),且左邊界值小于右邊界值。添加屬性值后,樹型結(jié)構(gòu)對應(yīng)的節(jié)點(diǎn)的屬性通常包含四種重要元素,節(jié)點(diǎn)ID,父節(jié)點(diǎn)ID,左邊界與右邊界,具體參見圖1o
[0010]本申請中快速查詢節(jié)點(diǎn)的具體實(shí)施步驟如下:
1.在數(shù)據(jù)庫中預(yù)先存儲樹型結(jié)構(gòu)數(shù)據(jù)表,所述樹型結(jié)構(gòu)數(shù)據(jù)表中包括多個節(jié)點(diǎn),每個節(jié)點(diǎn)包含左邊界字段,右邊界字段,父節(jié)點(diǎn)id和節(jié)點(diǎn)id字段四個屬性;
2.為樹型結(jié)構(gòu)數(shù)據(jù)表的左、右邊界以及父節(jié)點(diǎn)添加索引。
[0011]3.設(shè)置與樹型結(jié)構(gòu)數(shù)據(jù)表相關(guān)的插入觸發(fā)器、刪除觸發(fā)器、修改觸發(fā)器;所述插入觸發(fā)器、刪除觸發(fā)器、修改觸發(fā)器分別用于向樹型結(jié)構(gòu)數(shù)據(jù)表中插入節(jié)點(diǎn),刪除節(jié)點(diǎn),修改節(jié)點(diǎn);其中,
所述插入觸發(fā)器用于,當(dāng)在數(shù)據(jù)庫中對樹型結(jié)構(gòu)數(shù)據(jù)表添加節(jié)點(diǎn)時,先對樹型結(jié)構(gòu)數(shù)據(jù)表中的各節(jié)點(diǎn)進(jìn)行后序排列,找到待添加節(jié)點(diǎn)位置的后一個節(jié)點(diǎn),獲取該節(jié)點(diǎn)的右邊界值m,定義新添加節(jié)點(diǎn)的左、右邊界值分別為m,m+1,其中m為正整數(shù);將排在添加節(jié)點(diǎn)位置后的每個節(jié)點(diǎn)的右邊界都加2,而對應(yīng)的左邊界在其值大于m時都加2,其他情況下左邊界值不變。插入觸發(fā)器具體插入節(jié)點(diǎn)的方式參見圖2所示:有后序排列的樹BEFCDA,需要在節(jié)點(diǎn)B后添加一個節(jié)點(diǎn)G,這時把EFCDA每個節(jié)點(diǎn)的右邊界都加上2,即分別修改為:8,10,11,13,14。把EFCDA的所有左邊界大于6的都加2,即FD的左邊界最后為:9,12。
[0012]所述刪除觸發(fā)器用于,當(dāng)在樹型結(jié)構(gòu)數(shù)據(jù)表中刪除一個節(jié)點(diǎn)時,把整個樹型結(jié)構(gòu)數(shù)據(jù)表的各節(jié)點(diǎn)后序排列后,首先把待刪除節(jié)點(diǎn)刪掉,然后把排在需要刪除的節(jié)點(diǎn)后的所有節(jié)點(diǎn)的右邊界值減2,對應(yīng)的左邊界值在大于刪除節(jié)點(diǎn)的左邊界值時減2。即所述刪除觸發(fā)器與插入觸發(fā)器添加節(jié)點(diǎn)的步驟正好相反。刪除觸發(fā)器刪除節(jié)點(diǎn)的操作如圖3所示,當(dāng)需要刪除節(jié)點(diǎn)H時,首先把此節(jié)點(diǎn)刪掉,然后再把所有左邊界值大于8的節(jié)點(diǎn)的左邊界值減2,最后把右邊界值大于9的節(jié)點(diǎn)的右邊界值減2。
[0013]所述修改觸發(fā)器用于,當(dāng)修改數(shù)據(jù)庫中樹型結(jié)構(gòu)數(shù)據(jù)表的節(jié)點(diǎn)信息時,如果待修改節(jié)點(diǎn)的位置發(fā)生變換,先觸發(fā)刪除觸發(fā)器,進(jìn)行該節(jié)點(diǎn)的刪除操作,再觸發(fā)插入觸發(fā)器進(jìn)行該節(jié)點(diǎn)的添加操作。即把整個樹型結(jié)構(gòu)數(shù)據(jù)表的各節(jié)點(diǎn)后序排列后,首先把待修改節(jié)點(diǎn)刪掉,把后續(xù)排列后待修改節(jié)點(diǎn)之后的所有節(jié)點(diǎn)的右邊界值減2,對應(yīng)的左邊界值在大于待修改節(jié)點(diǎn)的左邊界值時減2,然后把此節(jié)點(diǎn)移至需要修改的位置,把其左邊界值設(shè)定為第一個后置節(jié)點(diǎn)(即需要修改的位置的后一個節(jié)點(diǎn))的右邊界值m,把其右邊界值設(shè)定為m+1,把所有后置節(jié)點(diǎn)的右邊界值加2,對應(yīng)的左邊界值大于m的將該左邊界值加2。修改觸發(fā)器修改節(jié)點(diǎn)的操作如圖4所示,如果需要把節(jié)點(diǎn)G的后置節(jié)點(diǎn)H移至F節(jié)點(diǎn)的前置位。首先將H節(jié)點(diǎn)摘除,把EFCDA的右邊界值減2后分別變?yōu)?8,10,11,13,14,把左邊界值大于8的左邊界值都減2,即FD變?yōu)?,12。然后把H節(jié)點(diǎn)左右邊界分別設(shè)置為此時F節(jié)點(diǎn)的右邊界值,和右邊界值加1,即設(shè)為:10,11。把H的后置節(jié)點(diǎn)FCDA的右邊界均加2,分別變?yōu)?2,13,15,16。把對應(yīng)節(jié)點(diǎn)中左邊界值大于8的左邊界值都加2,即D的左邊界設(shè)置為14。
[0014]4.當(dāng)需要查詢某節(jié)點(diǎn)的所有子節(jié)點(diǎn)時,在樹型結(jié)構(gòu)數(shù)據(jù)表中檢索左、右邊界值在待查詢節(jié)點(diǎn)的左、右邊界值之間的所有節(jié)點(diǎn),并記錄所檢索到的節(jié)點(diǎn)id,該id對應(yīng)的節(jié)點(diǎn)即待查詢節(jié)點(diǎn)的子節(jié)點(diǎn)。
[0015]當(dāng)對數(shù)據(jù)庫中樹型結(jié)構(gòu)數(shù)據(jù)表進(jìn)行子節(jié)點(diǎn)查詢時,經(jīng)過上述方式對樹型結(jié)構(gòu)數(shù)據(jù)表中的數(shù)據(jù)的存儲進(jìn)行優(yōu)化后,能夠以較高效率獲取查詢結(jié)果。通過為每個節(jié)點(diǎn)添加左右邊界屬性后,把樹型結(jié)構(gòu)數(shù)據(jù)表變成了扁平結(jié)構(gòu)。復(fù)雜度從指數(shù)型變成了直線型。