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