燕 衛
(廈門海洋職業技術學院,福建 廈門361012)
隨著XML的廣泛應用,XML正在成為數量龐大的數據源,如何利用RDBMS強大數據管理功能管理XML數據已成為一個研究熱點,由于XML數據與關系數據庫的數據模型不同,實現XML數據與數據庫數據的相互轉換顯得尤為重要。
將XML文檔映射為關系模式進行存儲,有兩大類映射方法:模型映射和結構映射。對于模型映射,利用xml文檔中的數據模型的結構顯性或隱性地映射成其他數據模型的結構,要實現數據庫和xml文檔間的數據轉換的關鍵是在數據庫模式和schemas和DTD之間建立映射關系,用具體的模型來實現數據間的映射。
一個XML文檔是一個樹狀結構,能夠用一個有序有向邊標記圖來表示,按深度有限的原則從樹葉往樹根搜索,每碰到一個內部節點則創建對應的抽象數據類型,直到根節點的直接子節點,創建基于次根節點所對應的抽象數據類型對象,該對象就是根節點對應的對象,最后將XML文檔中各元素的屬性值填入對象中的相應域。
有了XML圖之后,用來存儲邊信息的邊表有三種設計方案:Edge、Binary、Universal三種邊表設計方案和兩種值表設計方案,一共有六種存儲模式。通過對結構關系數據庫大小,執行不同類型XML查詢的執行時間,從關系數據重構XML文檔的時間等三個性能參數進行量化分析,結論是:Binary邊表帶內聯值表的存儲模式能獲得最好的綜合性能。
一個XML文檔可以被建模為一個樹,因此,一個XML文檔的集合可以被建模為一個森林。一個根結點的樹指向一個XML文檔,一個根結點是非文檔結點的樹指向一個XML文檔片段。因此一個XML查詢即可以在一個XML文檔樹或文檔森林上進行,也可以在一個XML文檔片段或森林片段上進行。
如何從一個DTD生成一個關系型結構?對于每種包含元素或者混合內容的元素類型,新建一個表和一個主鍵字段,對于每個包含混合內容的元素類型,創建一個單獨的表格,其中存放未析數據,通過父元素主鍵鏈接到父表格,對每個有元素或者混合內容的子元素,通過父元素主鍵將父元素表格和子元素表格相連接。
如何從一個關系型的結構生成一個DTD?對于每個表新建一個元素,對于表格中的每個字段,新建一個屬性或者是只包含未析數據的子元素;對于每個表格字段中提供主鍵的主鍵/外鍵的關系都新建一個子元素。
為了有效地實現對文檔樹中任意兩個結點對之間的祖先/后裔關系,利用擴展先序列表寫出它的先序遍歷序列,然后根據圖中各個節點左右孩子的狀況進行加以遍歷。基于節點的索引本質上即是將XML數據分解為數據單元的記錄集合,同時在記錄中保存該單元在XML數據中的位置信息。通過編碼技術索引每一個節點,節點之間的結構關系通過編碼可以在常數時間內確定它可以很好地支持正則路徑表達式。
XML文檔到數據庫的映射往往忽略XML文檔的物理結構(例如實體、引用文本部分及編碼信息)及某些邏輯結構(如處理指令、注釋以及子元素和模型組在元素聲明中出現的順序)。因為數據庫和應用程序只關心XML文件中的數據,因此在映射算法中先不考慮這些物理結構和邏輯結構的映射。
根據上述映射規則,可以將元素之間的樹型關系存入RDBMS。不過,首先需要對XML文檔進行解析以獲得DOM樹,并且要給DOM樹中的每個元素節點分別綁定唯一的ID(這在遍歷DOM樹時實現)。事先建一張元素關系表,表的字段分別代表當前元素節點的ID、當前元素節點的父節點ID、當前元素節點的名稱。然后根據上述算法對XML文檔進行解析。
根據上述的存儲策略,可以從關系數據庫中將數據恢復成XML形式:根據元素關系表來建立XML文檔中元素的嵌套關系,并分別查詢元素內容表和屬性值表來將各元素的內容和各元素的屬性及值插入元素節點。
這個原型系統實現了兩種方法的存儲,一種是以塊結構存儲,第二種以模型為基礎的映射存儲,通過原型的實現讓我們可以更加清楚直觀的理解XML存儲到關系數據庫的概念。
整個原型系統的工作流程是將讀入的XML文件經過解析遍歷,并在遍歷的同時進行判斷結點類型,插入相應的關系數據庫表中。
(1)classRdb主要用于創建數據庫的連接。
(2)classtest主要用于實現解析文檔并映射到關系數據庫的工作,這是對于上述算法的具體實現,主要實現函數有test(),stepThrough(Node start),complex(Node node)。
(3)classblobstore主要用于以塊結構存儲XML文檔。
(1)classAppFrame中調用了javax.swing.filechooser.*;這個包并重載了它,使它實現了對于文件過濾的功能。
(2)classsccuce用來判斷文件存儲成功與否,使用了彈出框的形式。
(3)classErrorDialog可以用來顯示程序運行過程中的一些異常,如文件已經存在關系數據庫中的重復存儲的異常。