一種樹形結構數據的數據庫存取方法
【技術領域】
[0001]本發(fā)明涉及計算機應用領域,尤其涉及一種樹形結構數據的數據庫存取方法。
【背景技術】
[0002]關系型數據庫儲存非線性關系的數據一般采用的外鍵,多表連接等方式,不僅不能發(fā)揮關系型數據庫的查詢優(yōu)勢,而且浪費大量存儲空間,造成數據冗余。常用的算法有路徑表示法(Path Enumerat1ns)、鄰接表表示法(Adjacency List)、閉包表表示法(ClosureTable)等。
[0003]路徑表示法需要記錄當前節(jié)點的所有父親節(jié)點在一個數據實體上面,為了記錄所有節(jié)點的父節(jié)點,數據庫的每一個表格都要為此開辟等于樹深度N的字段量。
[0004]鄰接表模型是在原有數據信息的基礎上增加一個記錄當前節(jié)點的父親節(jié)點ID的字段。增加節(jié)點時只用添加一條記錄即可;刪除節(jié)點時,若節(jié)點是葉子節(jié)點只用直接刪除,若是非葉子節(jié)點則需要遞歸刪除所有的直接和間接孩子節(jié)點;在查詢節(jié)點時,同樣要用遞歸操作才能實現查找從根節(jié)點到查詢節(jié)點的信息
閉包表表示法維護了兩張表,一張表是原始的信息,另一張表保存了所有的節(jié)點的孩子節(jié)點信息;該方法解決了數據完整性的問題,部分解決了增加和刪除是否困難和容易出錯的問題,但是這種方法以增加一個表格和浪費將近一倍的數據行的方式來實現了相對較優(yōu)的方案,而且在查詢方面由于涉及兩個表的操作,復雜性過高。
[0005]嵌套結合表示法對每一個節(jié)點,增加兩個字段,一個左索引號(Left_Index)和一個右索引號(Right_Index),索引號組成的區(qū)間[Left_Index, Right_Index]表示一個節(jié)點的起始和結束的范圍,這兩個數的差值表示當前節(jié)點的所有子節(jié)點的個數。利用索引提供的信息對數據節(jié)點進行操作節(jié)省了存儲空間,提高了查詢效率。
[0006]嵌套集合模型能快速的查詢節(jié)點所處位置的路徑信息和子節(jié)點信息,但是,在添加和刪除時需要修改所有父節(jié)點的左右索引值,因此需要大量的CPU的時間。為了減少占用客戶端的CPU時間和避免使用深度遞歸造成的使用困難,我們使用到數據庫的高級特性。
[0007]—方面,建立節(jié)點層次數量視圖,利用數據庫的觸發(fā)器,調用存儲在數據庫的添加和刪除的存儲過程,該存儲過程會觸發(fā)我們的添加和刪除觸發(fā)器,然后由數據庫服務器處理觸發(fā)程序,這樣就用異步的思想把客戶端等待的時間解放出來。
[0008]另一方面,把測點的ID用路徑表示法的思路來表示,這樣在修改單個節(jié)點的時候不用一個個的計算直接父節(jié)點的數值范圍。圖1測點ID的組成圖,下層節(jié)點的ID是上層所有ID的疊加,中間用下劃線隔開這樣就能讓節(jié)點的ID唯一化。
【發(fā)明內容】
[0009]本發(fā)明的目的在于針對現有技術的不足,提供一種樹形結構數據的數據庫存取方法,能夠高效方便的同時對數據庫中的非線性數據進行增加、刪除、修改和查詢等操作。
[0010]本發(fā)明的目的是通過以下技術方案來實現的:一種樹形結構數據的數據庫存取方法,包括以下步驟:
(1)在內存中建立數據的樹狀關系模型;所述樹狀關系模型僅有一個根節(jié)點,每個節(jié)點具有任意多個孩子節(jié)點,每個孩子節(jié)點僅有一個雙親節(jié)點;每個節(jié)點具有唯一的ID,且具有相同的屬性字段;
(2)在當前工作的主線程之外建立數據庫處理工作線程;
(3)主線程將對節(jié)點的數據庫操作命令發(fā)送給工作線程;
(4)將所有節(jié)點的信息統(tǒng)一抽象表示到一張數據庫表里,建立節(jié)點的關系型數據庫存儲表,在節(jié)點的關系型數據庫存儲表中增加兩個索引字段用于標識節(jié)點的層級關系;
(5)根據步驟4中的索引字段描述的層級關系建立節(jié)點操作的存儲過程,存儲過程使用前序遍歷算法,根據索引字段范圍隨時更新存儲表中的節(jié)點關系;所述存儲過程包括節(jié)點的增加、刪除、修改和查詢;
(6)數據庫處理工作線程根據主線程的操作命令,調用步驟(5)中相應的存儲過程。[0011 ] 進一步地,所述步驟(2)中,數據庫處理工作線程負責數據存取操作,數據庫處理工作線程和主線程異步運行。
[0012]本發(fā)明的有益效果是:本發(fā)明方法克服了占用客戶端的CPU時間和使用深度遞歸造成的棧溢出的問題,提高了數據的增加、刪除、修改和查詢的效率。
【附圖說明】
[0013]圖1為測點ID的形成方式;
圖2為增加一個節(jié)點的嵌套集合模型算法流程圖;
圖3為查詢一個節(jié)點的路徑嵌套集合模型算法流程圖。
【具體實施方式】
[0014]下面結合附圖和具體實施例對本發(fā)明作進一步詳細說明。
[0015]本發(fā)明一種樹形結構數據的數據庫存取方法,包括以下步驟:
(1)在內存中建立數據的樹狀關系模型;所述樹狀關系模型僅有一個根節(jié)點,每個節(jié)點具有任意多個孩子節(jié)點,每個孩子節(jié)點僅有一個雙親節(jié)點;每個節(jié)點具有唯一的ID,且具有相同的屬性字段;
(2)在當前工作的主線程之外建立數據庫處理工作線程;數據庫處理工作線程負責數據存取操作,數據庫處理工作線程和主線程異步運行;
(3)主線程將對節(jié)點的數據庫操作命令發(fā)送給工作線程;
(4)將所有節(jié)點的信息統(tǒng)一抽象表示到一張數據庫表里,建立節(jié)點的關系型數據庫存儲表,在節(jié)點的關系型數據庫存儲表中增加兩個索引字段用于標識節(jié)點的層級關系;
(5)根據步驟4中的索引字段描述的層級關系建立節(jié)點操作的存儲過程,存儲過程使用前序遍歷算法,根據索引字段范圍隨時更新存儲表中的節(jié)點關系;所述存儲過程包括節(jié)點的增加、刪除、修改和查詢;
(6)數據庫處理工作線程根據主線程的操作命令,調用步驟(5)中相應的存儲過程。實施例
[0016]根據屬性關系建立樹狀數據模型,樹狀結構中每個節(jié)點都有一致的屬性域,數據域和指針域。整棵樹只有一個根節(jié)點,每個節(jié)點可以有任意多個孩子節(jié)點,每個孩子節(jié)點只能有一個雙親節(jié)點。樹狀數據結構節(jié)點建立完之后可以對每一個節(jié)點進行遍歷操作。主線程發(fā)送數據庫操作命令給數據庫操作線程,數據庫操作線程調用相應的存儲過程返回結果O
[0017]圖1為測點ID的形成方式;圖2是增加一個節(jié)點的算法流程圖,增加一個節(jié)點時首先要判斷是否為根節(jié)點,如果根節(jié)點不存在那么插入的節(jié)點為根節(jié)點,左右索引即為[1,2],如果當前的節(jié)點不是根節(jié)點,則要獲得父節(jié)點的左右索引值[PL,PR],然后查找并且更新所有節(jié)點的右索引大于PR的節(jié)點,右節(jié)點索引值增加2,同時該節(jié)點的左索引也要加2,最后添加新節(jié)點,這時新節(jié)點的左索引為PR,右節(jié)點索引值為PR+2。刪除的過程是這個過程的逆過程,修改的算和這個算法類似。
[0018]圖3是查詢節(jié)點的流程圖,記當前節(jié)點的索引值為[L,R],那么,當前節(jié)點的孩子節(jié)點數量為N=[R-L-l]/2.而查詢所有孩子節(jié)點信息也只用一條SQL語句即可完成。可以看出查詢孩子節(jié)點個數和信息十分方便。在查詢所有父親節(jié)點的路徑時,只需要獲得所有索引值滿足左索引小于L,右節(jié)點索引值大于R即可。這里為了方便為樹狀表建立了層序遍歷的視圖,用視圖方式避免了每次計算N的值,減少計算量。
【主權項】
1.一種樹形結構數據的數據庫存取方法,其特征在于,包括以下步驟: (1)在內存中建立數據的樹狀關系模型;所述樹狀關系模型僅有一個根節(jié)點,每個節(jié)點具有任意多個孩子節(jié)點,每個孩子節(jié)點僅有一個雙親節(jié)點;每個節(jié)點具有唯一的ID,且具有相同的屬性字段; (2)在當前工作的主線程之外建立數據庫處理工作線程; (3)主線程將對節(jié)點的數據庫操作命令發(fā)送給工作線程; (4)將所有節(jié)點的信息統(tǒng)一抽象表示到一張數據庫表里,建立節(jié)點的關系型數據庫存儲表,在節(jié)點的關系型數據庫存儲表中增加兩個索引字段用于標識節(jié)點的層級關系; (5)根據步驟4中的索引字段描述的層級關系建立節(jié)點操作的存儲過程,存儲過程使用前序遍歷算法,根據索引字段范圍隨時更新存儲表中的節(jié)點關系;所述存儲過程包括節(jié)點的增加、刪除、修改和查詢; (6)數據庫處理工作線程根據主線程的操作命令,調用步驟(5)中相應的存儲過程。
2.根據權利要求1所述的一種樹形結構數據的數據庫存取方法,其特征在于,所述步驟(2)中,數據庫處理工作線程負責數據存取操作,數據庫處理工作線程和主線程異步運行。
【專利摘要】本發(fā)明公開了一種樹形結構數據的數據庫存取方法,該方法包括:使用面向對象方法抽象數據邏輯,建立樹形結構數據模型;使用多線程技術,在主線程之外建立數據存取線程;根據樹形結構的節(jié)點信息,建立對應的關系型數據庫數據表;在數據庫中建立數據節(jié)點增加、刪除、修改和查詢等存儲過程。本發(fā)明方法克服了占用客戶端的CPU時間和使用深度遞歸造成的棧溢出的問題,提高了數據的增加、刪除、修改和查詢的效率。
【IPC分類】G06F17-30
【公開號】CN104809190
【申請?zhí)枴緾N201510191491
【發(fā)明人】王友釗, 黃靜
【申請人】浙江大學
【公開日】2015年7月29日
【申請日】2015年4月21日