田昊宇,馬 義
(1. 沈陽市20中學(xué),沈陽 110003;2. 沈陽市回民中學(xué),沈陽 110016)
Native XML 數(shù)據(jù)庫在電子病歷存儲(chǔ)中的應(yīng)用分析
田昊宇1,馬 義2
(1. 沈陽市20中學(xué),沈陽 110003;2. 沈陽市回民中學(xué),沈陽 110016)
針對(duì)使用傳統(tǒng)關(guān)系型數(shù)據(jù)庫進(jìn)行電子病歷存儲(chǔ)所存在的數(shù)據(jù)建模復(fù)雜、擴(kuò)展性差、查詢性能低等問題,提出了使用Native XML數(shù)據(jù)庫來存儲(chǔ)XML格式的電子病歷,并以DB2 Pure XML數(shù)據(jù)庫為例,在實(shí)驗(yàn)環(huán)境下模擬構(gòu)造XML電子病歷數(shù)據(jù),分別就數(shù)據(jù)建模、查詢語言、客戶端開發(fā)和性能四個(gè)方面進(jìn)行驗(yàn)證與分析。驗(yàn)證結(jié)果顯示使用DB2進(jìn)行XML數(shù)據(jù)建模結(jié)構(gòu)簡(jiǎn)單、擴(kuò)展性好,優(yōu)于使用傳統(tǒng)對(duì)象關(guān)系模型建模;使用基于XQuery和XPath的查詢語言以及客戶端開發(fā)成本不高;在性能方面,基于10.6 k的病歷文件、100000數(shù)據(jù)量及有索引的情況下,查詢性能可以達(dá)到0.046秒。表明Native XML數(shù)據(jù)庫適合于構(gòu)建電子病歷的存儲(chǔ)。
電子病歷;XML;XQuery;XPath;DB2;Native XML數(shù)據(jù)庫
電子病歷(EMR,Electronic Medical Record)也叫計(jì)算機(jī)化的病案系統(tǒng)或稱基于計(jì)算機(jī)的病人記錄。它是用電子設(shè)備(計(jì)算機(jī)、健康卡等)保存、管理、傳輸和重現(xiàn)的數(shù)字化的病人的醫(yī)療記錄,取代手寫紙張病歷。它的內(nèi)容包括紙張病歷的所有信息[1-3]。
電子病歷具有數(shù)據(jù)量大、數(shù)據(jù)類型多樣、多層次結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)因人而異等特點(diǎn)。這種結(jié)構(gòu)的靈活性和對(duì)不同類型數(shù)據(jù)要求的多樣性,對(duì)基于傳統(tǒng)關(guān)系模型的數(shù)據(jù)庫管理系統(tǒng)軟件提出很大挑戰(zhàn)。
而XML(extensible markup language)作為一種可擴(kuò)展的結(jié)構(gòu)化標(biāo)記語言,在描述電子病歷內(nèi)容方面具有以下優(yōu)勢(shì):(1)XML采用了層次化面向?qū)ο蟮慕Y(jié)構(gòu)描述方法,非常適合于描述病歷這樣復(fù)雜的內(nèi)容,在表達(dá)能力上優(yōu)于關(guān)系數(shù)據(jù)庫。(2)XML是一種元語言,可以定義描述對(duì)象的結(jié)構(gòu)。這適合于病歷中不同內(nèi)容結(jié)構(gòu)的變化,適合于保持病歷的歷史。(3)XML將內(nèi)容與樣式關(guān)聯(lián)在一起,這不僅可以保留病歷內(nèi)容,也可保留病歷外觀。(4)XML作為電子商務(wù)時(shí)代的“標(biāo)準(zhǔn)語言”,擁有大量的開發(fā)和應(yīng)用工具,有利于對(duì)病歷內(nèi)容的處理[5]。
目前各類商業(yè)數(shù)據(jù)庫以及開源數(shù)據(jù)庫陸續(xù)推出了支持 XML存儲(chǔ)的功能特性,按照存儲(chǔ)方式的不同,可以分為三類:1)以CLOB為存儲(chǔ)單元的XML數(shù)據(jù)庫;2)以對(duì)象關(guān)系表為存儲(chǔ)單元的XML數(shù)據(jù)庫;3)以XML原始文檔為存儲(chǔ)單元的XML數(shù)據(jù)庫(Native XML數(shù)據(jù)庫)[4]。而其中Native XML數(shù)據(jù)庫以一種比較自然的方式來處理 XML數(shù)據(jù),能夠從各方面很好的支持XML數(shù)據(jù)的存儲(chǔ)和查詢,在多數(shù)場(chǎng)景下更具優(yōu)勢(shì)。為了驗(yàn)證對(duì)電子病歷支持的有效性,本文首先介紹了Native XML數(shù)據(jù)庫的特點(diǎn),并選用比較有代表性的DB2 Pure XML數(shù)據(jù)庫來構(gòu)建電子病歷實(shí)驗(yàn)數(shù)據(jù)集,然后分別從數(shù)據(jù)建模、查詢語言、客戶端開發(fā)、性能四個(gè)方面進(jìn)行驗(yàn)證分析,從而來證明Native XML數(shù)據(jù)庫支持電子病歷系統(tǒng)的有效性。
Native XML數(shù)據(jù)庫是以原始的XML格式存儲(chǔ)XML文檔,由于保證了XML數(shù)據(jù)的層次結(jié)構(gòu),可以根據(jù)XPath路徑直接定位到XML的節(jié)點(diǎn),無須解析成DOM,所以查詢的效率比較高。同時(shí)這種方式也消除了對(duì) Schema的格式依賴,在相同的數(shù)據(jù)列可以保存不同類型的XML文檔,靈活性比較高。Native XML數(shù)據(jù)庫也具有一般數(shù)據(jù)庫的特征,如:支持事務(wù)、并發(fā)控制、查詢語言、安全機(jī)制、應(yīng)用程序接口等[9-13]。
1.1 查詢語言
XPath[7-8]和XQuery[6]是W3C推薦的針對(duì)XML文檔的查詢語言。目前大部分Native XML數(shù)據(jù)庫產(chǎn)品都支持XPath,另外還有一些Native XML數(shù)據(jù)庫提供專有的查詢語言。XPath基于XML文檔樹形模型,給出從某個(gè)節(jié)點(diǎn)起的查詢路徑來搜索文檔。目前,XPath作為數(shù)據(jù)庫查詢語言還有不少缺陷,如不能執(zhí)行分組、排序、連接等操作。而 XQuery更像一種編程語言,支持循環(huán)等邏輯,支持分組、排序、連接等操作。相對(duì)于傳統(tǒng)數(shù)據(jù)庫的標(biāo)準(zhǔn)SQL語言,XQuery是一種針對(duì)XML數(shù)據(jù)查詢的功能強(qiáng)大、易于編程的語言。
1.2 更新和刪除
Native XML數(shù)據(jù)庫對(duì)XML文檔的更新和刪除方式有許多,如:簡(jiǎn)單的替換或刪除現(xiàn)有 XML文檔,修改當(dāng)前的 DOM樹,以及用于指定如何修改XML文檔片斷的語言。
1.3 事務(wù)、鎖定和并發(fā)
大多數(shù)的 Native XML數(shù)據(jù)庫都支持事務(wù),然而鎖定操作通常是對(duì)整個(gè) XML文檔進(jìn)行,而非對(duì)文檔片斷,所以對(duì)多用戶并發(fā)性的支持相對(duì)較低。
1.4 應(yīng)用程序接口
幾乎所有的 Native XML數(shù)據(jù)庫都提供編程接口,包括連接到數(shù)據(jù)庫、瀏覽與搜索元數(shù)據(jù)、執(zhí)行查詢和返回結(jié)果等方法。返回結(jié)果可能是 XML字符串、DOM tree或文檔的 SAX Parser(或 XML Reader)。當(dāng)返回結(jié)果是多個(gè)文檔時(shí),數(shù)據(jù)庫還會(huì)提供列舉(iterating)這些結(jié)果的方法。
1.5 Round-Tripping
Native XML數(shù)據(jù)庫的一個(gè)重要特性是為XML文檔提供round-T,即用戶將XML文檔存人數(shù)據(jù)庫后,可以再取回“同樣的”文檔。這對(duì)于以文檔為中心的應(yīng)用來說非常重要,因?yàn)?CDATA部分、實(shí)體應(yīng)用、注釋和處理指令是這些文檔不可缺少的組成部分。
使用DB2 Pure XML為電子病歷數(shù)據(jù)建模比較簡(jiǎn)單,只需要建立如下數(shù)據(jù)庫表,該表記錄了來某醫(yī)院就診的病人詳細(xì)歷史信息記錄,共2個(gè)字段,其中Patient_detail字段表示患者的電子病歷信息,字段類型為XML,表結(jié)構(gòu)如下。
表1 患者就診信息表Tab.1 The Table of patient medical information
Patient_detail字段是以XML格式表示的患者電子病歷信息,樣例如下(由于 XML文件較大,此處只截取關(guān)鍵片段):
……
+
+
+
patient >
XML樣例各節(jié)點(diǎn)含義說明如下:
表2 樣例XML格式說明Tab.2 Sample XML format specification
從以上建模方式來看,將患者的就診記錄組織成XML層次結(jié)構(gòu)保存到數(shù)據(jù)庫的XML字段中,只需要建立一張數(shù)據(jù)庫表。
而如果采用對(duì)象關(guān)系表來建模,通??梢圆捎每v向設(shè)計(jì)或橫向設(shè)計(jì)??v向的設(shè)計(jì),即對(duì)于不同的檢查項(xiàng)目?jī)?nèi)容保存到相同的字段中,如果明細(xì)內(nèi)容差異較大,需要不斷擴(kuò)展表的字段來容納就診信息,造成對(duì)表結(jié)構(gòu)的不斷調(diào)整以及語義不清和數(shù)據(jù)冗余;如果采用橫向設(shè)計(jì),即對(duì)于每種檢查項(xiàng)目明細(xì)用一張表來表示,同樣需要對(duì)就診項(xiàng)目明細(xì)的擴(kuò)展預(yù)留字段,而且對(duì)于查詢將造成多表關(guān)聯(lián),對(duì)性能產(chǎn)生影響。
因此關(guān)系型建模比較適合數(shù)據(jù)內(nèi)容比較固定,層次結(jié)構(gòu)不高的情況,而 XML的建模比較適合數(shù)據(jù)內(nèi)容比較靈活,層次結(jié)構(gòu)較高的情況。
DB2 Pure XML使用XQuery來檢索XML中的數(shù)據(jù)信息,使用XPath來定位數(shù)據(jù)節(jié)點(diǎn),以下定義了幾種常用操作場(chǎng)景來體現(xiàn)XQuery的特點(diǎn)。
場(chǎng)景1:根據(jù)ID號(hào)查詢某位患者的病例信息。
XQUERY db2-fn:xmlcolumn('ADMINISTRATO R.PATIENT.PATIENT_DETAIL')/patient[@id='00002 94067']
場(chǎng)景2:查詢某位患者的就診項(xiàng)目編碼
XQUERY db2-fn:xmlcolumn('ADMINISTRAT
場(chǎng)景 3:查詢某位患者在某個(gè)時(shí)間段就診過的病例信息
XQUERY db2-fn:xmlcolumn('ADMINISTRATO R.PATIENT.PATIENT_DETAIL')/patient[@id='00002 94067']/inpatient/date_of_admission[.OR.PATIENT.P ATIENT_DETAIL']/patient[@id='0000294067']/inpati ent/test_result/test/code/text() > xs:dateTime ("2011-03-10T15:04:57+08:00") and . < xs:dateTime("2017-03-30T15:04:57+08:00")] /../..;
場(chǎng)景4:查詢得過某種疾病的所有患者列表(例如:乙肝表面抗原為陽性的病人)
XQUERY db2-fn:xmlcolumn('ADMINISTRATO R.PATIENT.PATIENT_DETAIL')/patient/inpatient/test_result/test/test_items/test_item[name="乙肝病毒表面抗原" and value="陽性"]/../../../../../name/text()
場(chǎng)景 5:查詢進(jìn)行過某項(xiàng)檢查的患者信息(例如兩對(duì)半項(xiàng)目)
XQUERY db2-fn:xmlcolumn('ADMINISTRATO R.PATIENT.PATIENT_DETAIL')/patient/inpatient/test_result/test[name='兩對(duì)半']/../../../name/text()
場(chǎng)景 6:統(tǒng)計(jì)檢查出某種疾病的患者數(shù)量(例如乙肝病毒表面抗原為陽性的患者數(shù)量)
XQUERY count(db2-fn:xmlcolumn('ADMINIST RATOR.PATIENT.PATIENT_DETAIL')/patient/inpati ent/test_result/test/test_items/test_item[name="乙肝病毒表面抗原"and value="陽性"])
XQuery汲取了其它多種查詢語言的優(yōu)點(diǎn),適用于各種類型的 XML數(shù)據(jù)源的查詢,不僅查詢功能強(qiáng)大,而且簡(jiǎn)潔靈活且易于實(shí)現(xiàn)。從以上使用XQuery查詢語言的各類場(chǎng)景可以看出,XQuery完全可以完成查詢指定患者的信息、獲得某種疾病的患者信息、各類統(tǒng)計(jì)信息的查詢等各類模式匹配、過濾選擇和結(jié)果構(gòu)造等操作,基本可以滿足電子病歷各類操作的基本需求。數(shù)據(jù)庫業(yè)界的三大主流廠商Oracle、IBM、Microsoft都已經(jīng)在各自的產(chǎn)品中提供了對(duì)XQuery規(guī)范的支持。
客戶端開發(fā)主要驗(yàn)證了使用DB2 Pure XML對(duì)客戶端開發(fā)所帶來的影響與改變,軟件開發(fā)工具使用Eclipse 4.4,JDBC版本使用JDBC4.1,JDBC驅(qū)動(dòng)程序使用 Com.ibm.db2.jcc.DB2Driver。以下代碼片段實(shí)現(xiàn)了查詢所有乙肝病毒表面抗原為陽性的所有病人信息,以列表形式返回,java驗(yàn)證代碼片段如下:
Connection con = null;try{
Class.forName("com.ibm.db2.jcc.DB2Drive r").newInstance();
con = DriverManager.getConnection ("jdbc:db2:// IP:port/ins","user","pwd");
String query="select x.* from
administrator.patient, xmltable('$i/patient' passing patient_detail as "i" columns id varchar(40) path'@id', name varchar(40) path 'name') as x where xmlexists('$i/patient/inpatient/test_result/test/test_ite ms /test_item[name="乙肝病毒表面抗原" and value="陽性"]' passing patient_detail as "i") ";
PreparedStatement
stmt=con.prepareStatement(query);
ResultSet rs=stmt.executeQuery();
while(rs.next())
System.out.println(rs.getString(1) + " " +rs.getString(2));
}catch (SQLException e) {
……
}
}
程序執(zhí)行結(jié)果如下:
0000393374 楊飛
0000392367 陳麗如
0000397648 楊文軍
0000491349 李飛龍
0000283340 趙麗香
……
從以上示例代碼可以看出,使用 JDBC4.1對(duì)XML進(jìn)行查詢開發(fā)與對(duì)關(guān)系型數(shù)據(jù)表操作差別不大,對(duì)于XML的處理在JDBC中可以將查詢的XML文檔以字符串的形式返回,然后在客戶端可以使用dom4j等軟件包進(jìn)行字符串與dom的轉(zhuǎn)換,也可以使用xmltable函數(shù)直接以關(guān)系表的形式返回,查詢效果與關(guān)系表的查詢效果一致。
在性能驗(yàn)證方面,主要針對(duì)DB2 Pure XML插入數(shù)據(jù)和查詢數(shù)據(jù)兩方面做性能測(cè)試。
插入數(shù)據(jù):為真實(shí)驗(yàn)證數(shù)據(jù)庫的插入性能,我們直接采用編寫存儲(chǔ)過程,隨機(jī)構(gòu)造了10萬條XML數(shù)據(jù),循環(huán)插入。文件大小分別為3 K和11.6 K,目的是為了驗(yàn)證 XML文件的大小對(duì)插入數(shù)據(jù)的性能影響。測(cè)試時(shí)分別針對(duì)是否解析、是否有索引等情況進(jìn)行。
查詢數(shù)據(jù):查詢條件設(shè)置為 XML不同層級(jí)的節(jié)點(diǎn),分別為2、3、4、6層級(jí),先在沒有索引的情況下進(jìn)行測(cè)試,然后在有索引的情況進(jìn)行測(cè)試,以此來驗(yàn)證索引對(duì)XML查詢性能的影響。
基礎(chǔ)環(huán)境:服務(wù)器采用2*Intel(R) Xeon(R) CPU 5130 @2.00GHz,8 GB MEM;操作系統(tǒng)采用Microsoft Windows Server 2008 Enterprise Edition
驗(yàn)證結(jié)果如表3所示。
對(duì)于插入操作,可以看出是否在插入的同時(shí)建立索引對(duì)性能影響較大,這是因?yàn)镈B2使用的B樹索引在插入過程中不斷調(diào)整樹形結(jié)構(gòu),對(duì)性能產(chǎn)生很大影響;而是否解析則對(duì)插入的性能影響不大,說明DB2的解析效率較高。
表3 100000條數(shù)據(jù)插入驗(yàn)證結(jié)果Tab.3 Insert validation results of 100,000 data
表4 100000條數(shù)據(jù)查詢驗(yàn)證結(jié)果Tab.4 Query validation results of 100,000 Data
對(duì)于查詢操作,可以看出有無索引的差別很大,說明建立索引對(duì)性能的提升起到很大作用;而節(jié)點(diǎn)的層次深度對(duì)查詢時(shí)間的影響不大,體現(xiàn)了DB2層次型存儲(chǔ)的優(yōu)勢(shì)。
通過以上基于DB2 Pure XML數(shù)據(jù)庫進(jìn)行的一系列驗(yàn)證可以看出,在數(shù)據(jù)建模方面,支持 Native XML的數(shù)據(jù)庫結(jié)構(gòu)簡(jiǎn)單、擴(kuò)展性好,比基于傳統(tǒng)對(duì)象關(guān)系表有明顯的優(yōu)勢(shì);查詢語言方面需要了解XQuery和XPath的的相關(guān)語法后,可以實(shí)現(xiàn)與傳統(tǒng)SQL一樣的查詢效果,學(xué)習(xí)成本不高;在客戶端開發(fā)方面也比較簡(jiǎn)單,可以迅速上手;而在性能方面也擁有較好的表現(xiàn)。因此,在構(gòu)建電子病歷存儲(chǔ)方面,使用Native XML數(shù)據(jù)庫具有較好的應(yīng)用前景。目前應(yīng)用比較廣泛的Native XML數(shù)據(jù)庫除了DB2 Pure XML外,還有Oracle DB XML、Berkeley XML DB、Tamino、eXist、Xindice等都可以作為選型參考,由于各個(gè)數(shù)據(jù)庫系統(tǒng)在具體表現(xiàn)上會(huì)存在差異,在實(shí)際應(yīng)用前需要做進(jìn)一步驗(yàn)證。
[1] 吳旻峰. 基于XML的電子病歷系統(tǒng)及其院際信息共享技術(shù)研究[J]. 軟件, 2013, 34(01): 106-107.
[2] 孟尹. 中醫(yī)電子病歷的設(shè)計(jì)與實(shí)現(xiàn)[D]. 山東: 山東中醫(yī)藥大學(xué), 2013.
[3] 董國華, 朱習(xí)軍. 中醫(yī)肺病科電子病歷系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].軟件, 2014, 35(3): 17-19.
[4] 譚照峰. XML原生數(shù)據(jù)庫索引研究與實(shí)現(xiàn)[D]. 吉林大學(xué),2010.
[5] 謝娜, 戚曉明, 朱洪浩, 郭有強(qiáng). 半結(jié)構(gòu)化多文本數(shù)據(jù)挖掘的研究[J]. 齊齊哈爾大學(xué)學(xué)報(bào)自然科學(xué)版, 2015, 31(02):75-78.
[6] 李小青, 廖湖聲, 張曉博. XQuery實(shí)現(xiàn)技術(shù)研究綜述[J].計(jì)算機(jī)科學(xué), 2012, 39(03): 9-13.
[7] 阮娟. 基于XPath的新聞信息抽取系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 智能計(jì)算機(jī)與應(yīng)用, 2015, 5(02): 58-61.
[8] 干峰, 李超峰, 胡珊. XML數(shù)據(jù)庫技術(shù)及其在醫(yī)院信息系統(tǒng)中的應(yīng)用[J]. 醫(yī)學(xué)信息, 2009, 22(04): 463-465.
[9] 王鑫. 原生XML數(shù)據(jù)庫存儲(chǔ)與索引關(guān)鍵技術(shù)研究[D]. 南開大學(xué), 2009.
[10] 王慶福. 網(wǎng)站建設(shè)中數(shù)據(jù)庫技術(shù)與WEB技術(shù)的應(yīng)用對(duì)比研究[J]. 軟件, 2013, 34(2): 86-87.
[11] 胡芳, 沈紹武. 醫(yī)療數(shù)據(jù)集成平臺(tái)的研究與設(shè)計(jì)[J]. 世界科學(xué)技術(shù)-中醫(yī)藥現(xiàn)代化, 2015, 17(04): 916-921.
[12] 張婷婷. 原生XML數(shù)據(jù)庫存儲(chǔ)模型的研究[D]. 山西大學(xué),2012.
[13] 姚樹春. Oracle數(shù)據(jù)庫應(yīng)用中安全問題研究[J]. 軟件, 2014,35(1): 94-95.
The Application Analysis of Native XML Database in Electronic Medical Record Storage
TIAN Hao-yu1, MA Yi2
(1. Shenyang 20 middle school, Shenyang 110003,China; 2. The Huis' middle school of Shenyang, Shenyang 110016, China)
Based on the problem of traditional relational database for electronic medical records, such as data modeling of complicated, poor scalability, low query performance, put forward the use of Native XML database to store the XML format of electronic medical records, and with DB2 Pure XML database, for example, in the experimental environment simulation data of XML structure, data model, query language and client development and performance of four aspects for validation and analysis. The results show that using DB2 for XML data modeling structure is simple and extensible, which is better than modeling with traditional object relational model. Using query languages based on XQuery and XPath and client development costs are not high; In terms of performance,the query performance can reach 0.046 seconds based on 10.6 k of medical records, 100,000 data and indexes. It is shown that the use of Native XML database is applicable to the storage of electronic medical records.
: Electronic medical record; XML; XQuery; XPath; DB2; Native XML database
TP392
A
10.3969/j.issn.1003-6970.2017.10.041
本文著錄格式:田昊宇,馬義. Native XML數(shù)據(jù)庫在電子病歷存儲(chǔ)中的應(yīng)用分析[J]. 軟件,2017,38(10):202-206
田昊宇(2000-),男,學(xué)生;馬義,男,高級(jí)教師,研究方向:數(shù)據(jù)庫系統(tǒng)、網(wǎng)絡(luò)安全。