基于MML電子病歷存儲(chǔ)模型研究
本文通過分析現(xiàn)今主流的數(shù)據(jù)庫存儲(chǔ)模型,對(duì)基于MML標(biāo)準(zhǔn)的電子病歷構(gòu)建存儲(chǔ)模型。針對(duì)對(duì)象一關(guān)系型和關(guān)系型2種存儲(chǔ)模型比較分析,給出了基于MML標(biāo)準(zhǔn)的電子病歷系統(tǒng)的數(shù)據(jù)庫存儲(chǔ)模型設(shè)計(jì)方案。
1 引 言
MML(Medical Markup Language)作為一套不同醫(yī)療信息系統(tǒng)之間的數(shù)據(jù)交換規(guī)格于1995年開發(fā),是一套比較完整的使用XML結(jié)構(gòu)電子病歷交換標(biāo)準(zhǔn),目前最新版本是3.0。采用MML標(biāo)準(zhǔn)可以將基于異構(gòu)電子病歷的醫(yī)療信息系統(tǒng)很好的結(jié)合起來,實(shí)現(xiàn)數(shù)據(jù)的共享。
目前大多數(shù)采用電子病歷醫(yī)療信息系統(tǒng)的醫(yī)院都使用關(guān)系型數(shù)據(jù)庫,主要考慮到關(guān)系型數(shù)據(jù)庫有強(qiáng)大易用的查詢分析工具和易與醫(yī)院遺留系統(tǒng)整合的能力。但是由于基于MML的電子病歷映射到關(guān)系型數(shù)據(jù)庫時(shí),原有的層次結(jié)構(gòu)信息將丟失,此外關(guān)系型數(shù)據(jù)庫對(duì)基于MML的電子病歷內(nèi)的嵌套和遞歸結(jié)構(gòu)支持也較弱。
2數(shù)據(jù)庫類型選擇
針對(duì)醫(yī)療信息系統(tǒng)的研究發(fā)現(xiàn),兩類數(shù)據(jù)庫系統(tǒng)操作是必須的:操作類型(例如,統(tǒng)計(jì)、分析);研究類型(例如,查詢)。在分析應(yīng)當(dāng)選取何種類型的數(shù)據(jù)庫存儲(chǔ)模型作為研究對(duì)象時(shí),首要前提是要支持這兩類操作?,F(xiàn)有3種數(shù)據(jù)庫系統(tǒng)可以作為MML電子病歷的存儲(chǔ)模型,分別是XML原生數(shù)據(jù)庫、關(guān)系型數(shù)據(jù)庫和對(duì)象一關(guān)系型數(shù)據(jù)庫。
XML原生數(shù)據(jù)庫是專門為存儲(chǔ)XML數(shù)據(jù)設(shè)計(jì)的,支持DOM模型和斷言查詢。但現(xiàn)在缺乏商業(yè)級(jí)的產(chǎn)品,同時(shí)開發(fā)人員需要花費(fèi)相當(dāng)?shù)臅r(shí)間來熟悉和適應(yīng),在未來可能作為XML存儲(chǔ)的重要應(yīng)用但這里不作為分析研究的重點(diǎn)。
對(duì)于關(guān)系型數(shù)據(jù)庫系統(tǒng),當(dāng)MML電子病歷映射到數(shù)據(jù)庫時(shí),文檔內(nèi)在的層次關(guān)系將丟失。這可能不影響操作類型的操作,可是對(duì)審計(jì)跟蹤將有一定影響。作為現(xiàn)在主流的數(shù)據(jù)庫系統(tǒng),關(guān)系型數(shù)據(jù)庫系統(tǒng)有豐富強(qiáng)大的查詢和分析工具,各種優(yōu)化技術(shù)又使得性能高效,因此將其作為研究MML電子病歷系統(tǒng)存儲(chǔ)模型的對(duì)象。
相比之下對(duì)象一關(guān)系數(shù)據(jù)庫作為較新的數(shù)據(jù)庫系統(tǒng),其在關(guān)系型數(shù)據(jù)庫和面向?qū)ο髷?shù)據(jù)庫之間搭起了一座橋梁。對(duì)象一關(guān)系數(shù)據(jù)庫基于關(guān)系模型,存儲(chǔ)結(jié)構(gòu)和數(shù)據(jù)訪問都是基于標(biāo)準(zhǔn)的面向?qū)ο蟀姹镜腟QL。因?yàn)橐M(jìn)了OO概念,對(duì)象一關(guān)系數(shù)據(jù)庫也附加了、繼承和多態(tài)等OO特性。對(duì)象能存儲(chǔ)在表內(nèi)并包含方法。由于擴(kuò)展了面向?qū)ο蟮奶匦?,支持?fù)雜數(shù)據(jù)類型,對(duì)象一關(guān)系數(shù)據(jù)庫比傳統(tǒng)關(guān)系型數(shù)據(jù)庫更適合作為MML電子病歷的存儲(chǔ)模型。
MML電子病歷包括各種檢驗(yàn)表、圖形等對(duì)象需要專門的方法來查詢,在這種情形下對(duì)象一關(guān)系型數(shù)據(jù)庫就尤顯優(yōu)勢(shì)。
3存儲(chǔ)模型設(shè)計(jì)和實(shí)現(xiàn)
采用傳統(tǒng)的ANSI三層數(shù)據(jù)庫模型(外層、邏輯或內(nèi)層、物理層)來設(shè)計(jì)MML電子病歷存儲(chǔ)模型。概念設(shè)計(jì)階段的目標(biāo)是構(gòu)造出獨(dú)立于具體數(shù)據(jù)庫管理系統(tǒng)的數(shù)據(jù)庫概念模式。在邏輯層設(shè)計(jì)的過程中,選用特定的數(shù)據(jù)模型將概念模式映射到邏輯模式。最后一步按照物理存儲(chǔ)結(jié)構(gòu)開發(fā)數(shù)據(jù)庫的規(guī)范,底層算法用來設(shè)計(jì)執(zhí)行數(shù)據(jù)榆索和數(shù)據(jù)管理。
3.1 基于MML電子病歷的ER模型
在概念設(shè)計(jì)階段采用廣為使用的實(shí)體一關(guān)系(ER)模型。根據(jù)MML電子病歷處理過程,設(shè)計(jì)了包括3個(gè)實(shí)體和8種關(guān)系的模型,3個(gè)實(shí)體分別為:Person,MML-emr和Organization。
針對(duì)設(shè)計(jì)出的ER模型(見圖1),町以選用對(duì)象導(dǎo)向的方法或傳統(tǒng)的純關(guān)系數(shù)據(jù)模型方法。下而將詳細(xì)討論對(duì)比兩種方法,找出各自的優(yōu)缺點(diǎn)。
3.2對(duì)象一關(guān)系型存儲(chǔ)模型設(shè)計(jì)
在將ER模型映射到對(duì)象一關(guān)系模型時(shí),最直接的辦法是采用對(duì)象描述實(shí)體。表1為Person對(duì)象及其對(duì)應(yīng)屬性。
需要注意的是有4個(gè)屬性是對(duì)象數(shù)組用以表示PER-AON實(shí)體的多值屬性。MML_emr和Organization對(duì)象和Person對(duì)象類似。ER圖中的關(guān)系也可映射為對(duì)象,表2為3個(gè)實(shí)體之間的關(guān)系。
ER模型中的多值屬性可以用VARRAYS或者嵌套表表示,嵌套表更適合對(duì)一組需求的查詢,如果是要通過單個(gè)操作完成的組需求的話VARRAYS效率更好些。
在對(duì)象一關(guān)系模型中,N∶M關(guān)系可以通過在嵌套表上添加REF(類似參考類型指針)實(shí)現(xiàn)。以MML電子病歷提供者provider和MML-emr之間的關(guān)系為例。每一個(gè)oo_MML_emr包含有oo_provider的嵌套表,每個(gè)oo_provider屬性指向一個(gè)person對(duì)象。在對(duì)象-關(guān)系模型中只需兩張表MML_emr和person就可以表示出這個(gè)N∶M的關(guān)系。而在關(guān)系型模型中需要MML_emr,per-son和MML_emr_person三張表。
l:M關(guān)系的實(shí)現(xiàn)在2種模型相似,在對(duì)象一關(guān)系模型中使用REF類型,而在關(guān)系模型中使用外鍵。
3.3 關(guān)系型存儲(chǔ)模型設(shè)計(jì)
采用標(biāo)準(zhǔn)算法將ER模型映射到關(guān)系型模型。首先為ER模型中的每個(gè)實(shí)體創(chuàng)建1張表;再對(duì)ER模型中的每個(gè)多值屬性創(chuàng)建表;1∶M類型的關(guān)系通過添加外鍵來實(shí)現(xiàn);N∶M類型的關(guān)系使用單獨(dú)的表。由于基于MML的電子病歷包括大量的多值屬性和N∶M類型關(guān)系,所以相對(duì)于對(duì)象一關(guān)系模型會(huì)產(chǎn)生大量的表。
鑒于關(guān)系型數(shù)據(jù)庫在信息系統(tǒng)中的設(shè)計(jì)問題已經(jīng)有了詳盡深入的研究,這里就不詳細(xì)展開了。
4 比較
在前述段落提到的分析結(jié)果我們認(rèn)為基于MML電子病歷的數(shù)據(jù)庫存儲(chǔ)模型的最佳選擇是對(duì)象一關(guān)系類型。針對(duì)對(duì)象一關(guān)系型數(shù)據(jù)庫有2種設(shè)計(jì)方法,一種是把包括數(shù)據(jù)成員和方法的對(duì)象存儲(chǔ)到表中;另一種是在只使用傳統(tǒng)關(guān)系型數(shù)據(jù)庫設(shè)計(jì)方法不能滿足需求時(shí)才采用面向?qū)ο蟮姆椒▉聿僮鲗?duì)象。
就分別采用這2種方法設(shè)計(jì)和實(shí)現(xiàn)對(duì)象一關(guān)系模型過程中存在的問題和對(duì)執(zhí)行結(jié)果的分析來討論二者的優(yōu)劣。
4.1 實(shí)現(xiàn)問題
對(duì)象關(guān)系模型創(chuàng)建的表的數(shù)量較關(guān)系型模型少許多,且使用基于對(duì)象方法的簡單表達(dá)式使得查詢也趨于簡單化。但是對(duì)象方法要認(rèn)真設(shè)計(jì)實(shí)現(xiàn),否則某些查詢因?yàn)闆]有設(shè)計(jì)合適的對(duì)象方法將無法完成。
設(shè)計(jì)實(shí)現(xiàn)對(duì)象一關(guān)系數(shù)據(jù)庫時(shí),每個(gè)對(duì)象都要考慮采用何種類型,是否使用用戶自定義類型(UDT)。對(duì)每個(gè)對(duì)象可能有的查詢/操作認(rèn)真分析,據(jù)此設(shè)計(jì)用戶自定義函數(shù)(UDF)。例如,通過名字Bob Smith查詢病人電話列表,下面列出對(duì)象一關(guān)系的SQL語句:SELECT o.phoneFROM oo.person o WHERE o.hasName('Bob','Smith');這里必須為oo.person對(duì)象設(shè)計(jì)該hasName自定義方法,不然將無法進(jìn)行此查詢。在對(duì)象一關(guān)系模型中需要設(shè)計(jì)大量自定義方法。在傳統(tǒng)關(guān)系型模型,該查詢可以通過下列語句實(shí)現(xiàn):SELECT o.phone FROM person p,person-name n person-phom o WHERE n.name='Bob Smith'AND n.id=p.id AND o.id=p.id;需要連接3個(gè)表。
對(duì)象一關(guān)系模型中表的查詢/操作比傳統(tǒng)的關(guān)系型模型簡單直觀,但是需要編程實(shí)現(xiàn)大量的自定義函數(shù)。此外由于N∶M關(guān)系是通過在對(duì)象中添加嵌套表或數(shù)組實(shí)現(xiàn)的,設(shè)計(jì)人員必須認(rèn)真考慮應(yīng)該將其添加到該關(guān)系相關(guān)的哪個(gè)對(duì)象上。
4.2 時(shí)延分析
對(duì)兩個(gè)均包含100份MML電子病歷的對(duì)象一關(guān)系數(shù)據(jù)庫和傳統(tǒng)關(guān)系型數(shù)據(jù)庫進(jìn)行比較。選取下面4組典型的數(shù)據(jù)庫操作分別在2個(gè)數(shù)據(jù)庫上運(yùn)行,以比較性能:
(1)使用簡單搜索規(guī)則對(duì)單個(gè)病人進(jìn)行數(shù)據(jù)檢索,例如通過名字檢索病人數(shù)據(jù);
(2)多病人數(shù)據(jù)檢索查詢;
(3)檢索MML emr tab表數(shù)據(jù)(不是病人數(shù)據(jù));
(4)增、刪和更新數(shù)據(jù)。
使用Oracle9i實(shí)現(xiàn)2個(gè)數(shù)據(jù)庫,共進(jìn)行13組操作,每組運(yùn)行5次取平均時(shí)間。實(shí)驗(yàn)結(jié)果表3所示,對(duì)象一關(guān)系模型包含2列,2個(gè)版本的差別在于版本二只在必須的情況下使用用戶自定義函數(shù)(UDF)。Q1到Q3屬于分組一,在兩種數(shù)據(jù)庫中都沒有使用UDF。Q4到Q6屬于分組二,分別對(duì)oo_person_tab,oo_organization和oo_MML表進(jìn)行多病人數(shù)據(jù)檢索查詢。以Q4為例,該查詢需要掃描整個(gè)oo_person_tab表以便執(zhí)行hasName()。Q4的時(shí)間復(fù)雜度為O(n)。使用類似hasName(),hasID()等UDF的查詢依賴于表的行數(shù)。關(guān)系型數(shù)據(jù)庫采用優(yōu)化技術(shù),時(shí)間復(fù)雜度為O(log(n)),對(duì)對(duì)象一關(guān)系數(shù)據(jù)庫的優(yōu)化由于UDF非常復(fù)雜,難于優(yōu)化。Q7,Q8和Q9屬于分組三,在對(duì)象一關(guān)系數(shù)據(jù)庫的2個(gè)實(shí)現(xiàn)中也同樣發(fā)現(xiàn),版本二由于只在必須時(shí)使用UDF,執(zhí)行時(shí)延得以大幅縮短。分組四同樣是使用UDF的緣故,執(zhí)行效率傳統(tǒng)關(guān)系型數(shù)據(jù)明顯高于對(duì)象一關(guān)系型。
5 結(jié) 語
設(shè)計(jì)層次上,對(duì)象一關(guān)系模型因?yàn)楸淼臄?shù)量比較少而顯得比較簡潔,但設(shè)計(jì)的過程不如關(guān)系型模型直觀,設(shè)計(jì)人員需要認(rèn)真考慮對(duì)象間的關(guān)系應(yīng)當(dāng)如何表示。實(shí)現(xiàn)層次上,對(duì)象一關(guān)系模型需要提供支持多值屬性和關(guān)系的搜索方法的具體實(shí)現(xiàn),可以使用嵌套表或數(shù)組表示;關(guān)系型模型則采用獨(dú)立表,不需要設(shè)計(jì)人員編寫代碼。
查詢和執(zhí)行方面,在對(duì)象一關(guān)系模型上的查詢表達(dá)式簡潔直觀,但需要事先編程實(shí)現(xiàn)對(duì)象方法。傳統(tǒng)關(guān)系型模型的數(shù)據(jù)庫操作效率要高過對(duì)象一關(guān)系模型。綜上,因?yàn)榛贛ML的電子病歷系統(tǒng)的原型非常復(fù)雜,使用對(duì)象一關(guān)系型存儲(chǔ)模型可以簡化數(shù)據(jù)庫的設(shè)計(jì)和實(shí)現(xiàn),縮短開發(fā)周期;同時(shí)可以結(jié)合傳統(tǒng)關(guān)系型的優(yōu)點(diǎn),只在必須用用戶自定義方法的時(shí)候才使用UDF,一方面可以提高執(zhí)行效率;另一方面可以盡量避免因?yàn)闆]有提供必要的UDF而不能執(zhí)行電子病歷靈活多樣的數(shù)據(jù)庫查詢操作。
更多醫(yī)療電子信息請(qǐng)關(guān)注:21ic醫(yī)療電子頻道