2011-07-13 39 views
7

我想存儲我在我的java web服務中收到的xml。 報告將每隔5分鐘運行一次,以便在xml元素中提取一些數據。在數據庫中存儲XML數據 - 許多表vs vs在列中轉儲xml

我想到了兩種方法來解決這個問題。

  1. 在數據庫中創建多個表以捕獲xml數據。 基本上每個元素在數據庫中都有自己的列。

  2. 將整個xml轉儲到可以存儲xml數據的列中。 用於報告目的解析查詢本身的值。

其中上述方法比較好,特別是 在性能方面?這是至關重要的,因爲報告將以非常高的頻率(每5分鐘)產生。

xml模式非常複雜,並不是一個簡單的模式。

回答

8

如果要將數據寫入一次並進行多次查詢,解析XML文檔一次,將數據存儲在適當的關係模式中,並查詢關係模式幾乎肯定會更高效。解析XML並不便宜,因此每5分鐘解析潛在多個XML文檔的開銷可能會很大。

當然,所有性能問題,您的里程可能會有所不同,因此它可能值得測試。如果您使用的是Oracle 11.2,並且將數據存儲爲二進制XML(在這種情況下,它在分析後存儲),並且您正在存儲的XMLType上創建適當的XMLIndexes,但將數據保留在XML文檔中的性能損失可能是相當小。它應該仍然比適當的關係結構慢,但是這種差異可能對你沒有意義。

就個人而言,我更喜歡關係存儲方法,即使忽略性能問題,因爲它使其他人與數據交互更容易。有更多的開發人員可以編寫體面的SQL,而不是編寫體面的XPath表達式,並且有更多的查詢工具可以生成關係表以外的報表,而不是可以從存儲在數據庫中的XML生成報表。

4

即席訪問

如果你需要運行efficent查詢上載於即席或任意方式的XML數據,你應該分析它伸到TablesColumns能夠在邏輯是指數和加入後。

受限訪問

如果你只是存儲數據,並提供其基於一些其他標準,如獨特的ID或其他鍵,XML本質上是一個不透明的BLOB然後就存放在一個BLOB列並完成它。

混合模型

什麼,你可能會需要的是介於兩者之間,在XML存儲在BLOB,只有相關的位存儲在TablesColumns這樣可以有效地搜索XML有效載荷。

+0

混合模式:您的意思是經常在表格中查詢商店元素並將xml存儲爲blob?如果需要,可以從xml查詢其他元素。 – Maximus

5

Maximus, 這實際上取決於你想要用XML數據做什麼。

當我將XML用於控制目的(例如配置頁面顯示方式)時,我會將整個XML存儲在單個BLOB字段中。它速度快,非常簡單。這是一個簡單的保存和加載例程。您可以在BLOB字段中輕鬆查看XML,並對其進行編輯。

如果您需要搜索或報告XML內部的值,例如有多少客戶擁有特定屬性,那麼您可能需要解析爲單個屬性。這通常意味着你將不得不做一些事前和事後處理,但可以讓你快速獲得個人屬性。

1

不知道多少,很難說肯定,但很可能你缺少一個可以簡化生活的重要部分。從XML

  1. 綁定到的POJO(JAXB,莫西或JIBX)
  2. 存儲爲歸列從POJO(使用jDBI,休眠,甚至是簡單的JDBC模板)

而且,這依賴於您可能會考慮將數據保存在內存中的可能性 - 每隔5分鐘聽起來不像性能嚴重,但不一定需要持久性(或僅用於歷史數據或備份)。

1

如果你需要保持和查詢比一對夫婦,你應該使用一個XML數據庫的XML文檔的更多..

eXist是好的,讓那些個XML在一列或多個表disagrete他們是一個壞的選擇我想..

0

你也可以檢查出XMLDATA列式這是sqlserver的或XML類型在甲骨文 http://msdn.microsoft.com/en-us/library/hh403385.aspx

您可以爲被查詢的那些XML領域對XML數據列計算列大多數這將有助於快速呃檢索。要在某個xpath中檢索某個值,只需要將xpath傳遞給sqlserver,以便將xpath處的值返回給您。