當在關系數據庫中保存XML文檔的時候,由於采用方法上的原因,尤其是對於大量的文檔,你一定碰到過很多問題。這一篇文章將提出與大量XML文檔相關的特定的問題,然後給出解決這些問題的方法。
數量非常大的文檔的潛在問題
什麼東西使得一個XML文檔變得非常巨大?一個XML文檔變得巨大的其中一個跡象是文檔啟動的時候就出現問題。現在讓我們討論其中的潛在問題。
首先是有關原始空間(raw space)的觀點。出現的問題與頻率和空間相關。並不是你的文檔大於通常情況下的狀態,而是你頻繁地使用它們。你必須需要有一個良好的尺寸數據分區來存放這些文檔(或者數據庫)。
第二,運行數據庫可能會產生錯誤。有時候XML文檔會分成多個部分,並存放在代表XML文檔結構的不連續的表中,但通常情況下,XML文檔存放在BLOB域,文本域,或者VARCHAR域中。
除在設計上的缺欠之外,你還有可能碰到與數據庫相互通訊的界面上的問題。例如,絕大多數SQL執行都限制數據為4,096字節——這就意味著,當使用SQL必向數據庫發送10KB文檔的時候,你會遭到障礙。在數據庫存儲程序中也會存在類似的限制。如果你沒有意識到這些限制以及你的文檔超出范圍,你將會碰到這些問題。
數據庫設計
開發人員和數據庫管理人員必須清楚地理解XML文檔中將要產生的操作,這樣才有可能正確地設計數據庫。理解數據庫將如何被使用也同樣是相當的重要。你的XML文檔是簡單的連續存放機制?還是存放在非連續的狀態之中?
如果你以整塊方式存儲整個文檔,這樣你就有多種選擇。對於非連續數據,你應該設計出代表XML結構的表,並將數據分開存放在獨立的表中。第二個步驟的優點是在於可索引性和可查詢性,而你不需要對整個文檔進行操作。
BLOB(二進制大型對象)域被用於存儲大型的二進制格式的數據。例如,加密文件常用於BLOB域。BLOB域非常適合於存放XML文件。BLOB域的缺點是它不是可索引性和可查詢性,以及不能通過標准的SQL與BLOB交換大量的數據。
分割
解決SQL限制的其中一個方法是將XML文檔分割成為4KB或小的塊。這些小塊再存放在表中,然後使用ID域將這些小塊聯系起來。
當你存儲這些文檔的時候,你應該將它們分割成為小塊並存放在表中。當你返回文檔時,你通過特定的ID選擇所有的塊,然後以合適的順序對它們進行集合。雖然比較麻煩,但這一方法對於多數據庫非常有用。
捆綁及BLOB訪問
大型BLOB數據的問題在於你不能使用SQL存儲和獲得數據。近年來每一種數據庫商家都具有自己的存儲和獲得大型對象的方法。
為了在一個BLOB域中存儲大量的XML文檔,你必須使用捆綁(binding)。捆綁是將數據從程序代碼與數據庫中的域相互聯系的過程。使用這一方法,當改變數據庫的時候,會有可能影響數據庫的其他功能。
總結
在關系數據庫中存儲大量XML文檔會導致很多問題。解決這些問題的首要步驟是深刻理解XML文檔中的參數。然後正確地設計合適的解決方法。解決方法可以包括:一系列的結構表,將XML文檔分割為小塊,或者直接捆綁到數據庫中的BLOB域。