DB2 pureXML 功能提供成熟的 XML 儲存、索引、驗證、查詢能力,並完全整合 DB2 關聯數據管理。本文不介紹功能運作細節,而是提供確保高效能 pureXML 的指南,示範如何開發 pureXML 功能有效解決具體業務問題。依資料庫物件生命週期組織主題,使用金融衍生品交易 (FpML) 真實場景串聯最佳實踐。
XMLTABLE 或 XMLQUERY 從 XML 文檔提取數據XMLEXISTS 謂詞指定 XML 數據謂詞,透過檢查更少行提升查詢性能XML 提供通用彈性方法在不同系統、應用、組織間交換數據。自描述格式維護數據,滿足所有業務需求。標籤描述數值,嵌套標籤表示層次關係。XML 能描述高度結構化數據並透過 XML Schema 保持結構,也能描述半結構化數據(普遍存在於內容導向應用)。SOA、EAI、EII、Web Services、企業消息總線等標準化成就均依賴 XML 作為底層交換技術。行業機構用標準化 XML Schema 促進信息交換並演進滿足變化需求:保險 ACORD、金融 FpML/FIXML、供應鏈 UBL、零售 ARTS、醫療 HL7、商業報告 XBRL、出版 DITA 等。XML 文檔常在基於訊息的事務系統中表現事務記錄。政府與企業對保留原始訂單、請求、聲明、交易、簽名負更多責任,XML 提供簡單方法捕獲維護相關數據。
XML 作為自描述格式,允許不同數據(有/無模式)同時存在一文檔或一行中,不犧牲搜尋聚合能力。應用可在不改底層資料庫模式下演進自身 XML Schema。但擴展性意味著檢查解釋 XML 需更多 CPU/I/O——可能不切實際。關聯模式需較少解釋、允許更多優化操作、提供極高性能,但無法滿足應用所需模式彈性。關聯模型適合穩定數據結構與可預知訪問模式;XML 適合複雜多變數據結構、混合結構化/非結構化信息應用。
某些情況 XML 性能優於關聯模型:關聯庫常需標準化使業務數據適應扁平結構,複雜數據標準化需存取時轉換、導致多路連接。XML 可在一文檔中更自然表現複雜業務物件及其所有關係,XML 文檔中的層次本質上是預先計算的相關數據條目間連接。選擇數據模式另一考量是應用如何使用數據:即使源自 XML,若後續處理依賴表格數據(如數倉 OLAP),存關聯格式或許更正確。
關聯難題:模式頻繁變更,修改關聯模式產生成本開銷。加列、加表、刪列、改類型無痛;但正規化一表為多表極難——先改表再改應用 SQL。
XML 方案:易變部分作為單獨 XML 列存在。XML 天然自描述擴展性無縫處理模式變更,文檔格式變更通常無需改資料庫表/列,不破壞現有 XML 查詢。
關聯難題:天然分層/遞歸數據(物料清單、工程物件、生物數據)在關聯模式難表現,需遞歸 SQL 重構。
XML 方案:XML 本質是階層模式,極自然表現階層業務數據。若需表格形式,XML 以簡單導航訪問替代複雜操作序列。
關聯難題:業務物件(如保險單)從保留數據條目與詳細聲明的組合獲益,而非分散到系列表中。尤其對無獨立業務含義、需完整上下文解釋的單獨條目。正規化進數十表意味著應用處理複雜且對業務不成體系的數據,增加負載與出錯率。
XML 方案:XML 表現極複雜業務物件(緊密相關文檔與截然不同文檔),同時捕獲所有構成條目間關係。每行一 XML 文檔表現一保單,給開發者直觀儲存模型、快速開發。
關聯難題:極多可能屬性但多數稀疏(如產品目錄:尺寸、顏色、重量、長度、高度、材質、款式、編織、電壓、解析度、排水...任一產品僅關聯子集)。關聯法一:每屬性一列 → 大量 NULL 低效。法二:三列表存名值對 → 屬性名非列名而是 VARCHAR 值,關聯無法精確估計約束與查詢計劃,定義執行約束(如特定屬性唯一性)極難。
XML 方案:XML 元素屬性可選,不需要的完全省略,無 NULL、無名值對。XML Schema 定義極多可選元素,每物件僅用子集。關聯表每行必有相同列,XML 列每行可有不同元素。稀疏元素的 XML 索引極小,優於關聯索引每行嚴格輸入。
關聯難題:從關聯表導出記錄發送給其他應用/組織,接收方無額外元數據無法解釋,尤其模式已變時。
XML 方案:XML 自描述,標籤即描述嵌套值的元數據。
「金融衍生品交易」基於其他金融資產(股票、指數、利率、匯率等)。雙方同意根據影響底層資產的市場條件交換現金。一方利用交易減輕風險,另一方獲即時收入(費用)或投機未來市場獲利。衍生交易特點:(a) 類型變化多、(b) 條款常單獨談判且複雜、(c) 生命週期從天到年、條件隨時間變化。金融機構發現需 XML 彈性擴展性定義捕捉高度變化的標準數據格式,結果開發了 FpML(金融產品標記語言)。FpML 本質是定義 XML 元素屬性如何描述金融衍生交易的 XML Schema。ISDA 代表投資銀行組織管理 FpML 標準使場外衍生交易。樣本資料庫 3 表:
CREATE TABLE trades (tradeId INTEGER, tradedoc XML);
CREATE TABLE parties(partyInfo XML);
CREATE TABLE currencies(symbol CHAR(4), name VARCHAR(30), USDvalue DOUBLE, lastUpdated TIMESTAMP);
TRADES 表含 FpML 文檔與交易 ID,文檔涉及兩方用 PRTYID 識別。詳細信息以 XML 存 PARTIES 表。可從 TRADES 與 PARTIES XML-to-XML 連接找到交易方詳情。貨幣信息在關聯 CURRENCIES 表,需 XML-to-關聯連接關聯交易與貨幣信息。
SYMBOL NAME USDVALUE LASTUPDATED
USD US Dollar 1.000 2008-02-05-15.15.57
EUR Euro 1.460 2008-02-05-15.15.59
GBP Great Britain Pounds 1.960 2008-02-05-15.16.23
JPY Japanese Yen 0.009 2008-02-05-15.15.53
CNY Chinese Yuan (RMB) 7.190 2008-02-05-15.16.13
<Party>
<PtyID>510026</PtyID> <ShortName>MIB</ShortName> <Name>MyGlobal International Bank</Name> <Status>Active</Status>
<Address><Street>498 Wall Street</Street><City>New York</City><Country>USA</Country></Address>
<Rating><RatingDate>2006-05-16</RatingDate><RatingValue>Baa1</RatingValue></Rating>
</Party>
<Party>
<PtyID>67781</PtyID> <ShortName>NVB</ShortName> <Name>National Village Bank</Name> <Status>Active</Status>
<Address><Street>1805 Back Street</Street><PostalCode>EC3M 4TD</PostalCode><City>London</City><Country>UK</Country></Address>
<Rating><RatingDate>2006-06-01</RatingDate><RatingValue>Aa</RatingValue></Rating>
</Party>
<Party>
<PtyID>99114</PtyID> <ShortName>YWI</ShortName> <Name>YourWorld Investments</Name> <Status>Active</Status>
<Address><POBox>98765</POBox><PostalCode>100027</PostalCode><City>Beijing</City><Country>China</Country></Address>
<Rating><RatingDate>2007-01-15</RatingDate><RatingValue>Aaa</RatingValue></Rating>
<Rating><RatingDate>2005-04-21</RatingDate><RatingValue>Aa</RatingValue></Rating>
</Party>