2011-02-04 31 views
2

在我當前的項目中(訂單管理系統從頭開始構建),我們正在以保存在關係數據庫中的XML對象的形式處理訂單。XML與對象樹

我就勾勒出這樣的要求:選擇的順序從任何地方的各種細節

  • 更新/(從CRM系統如)
  • 豐富的數據保持的紀錄變化(無效舊數據,插入新的值)的訂單
  • 細節應該是由SQL查詢容易選擇(爲2級支持)

我們做了什麼:

  • 序列化與專有代碼完成,拆卸順序到表像customeraddressphone_numberorder_position
  • 每當爲了進一步加工了一下(例如由於傳入的事件),它將從數據庫中完全讀取並彙編回XML文檔。
  • 數據的選擇由XPath完成(分散在代碼中)。
  • 大部分更新都是直接在數據庫中完成的(訂單將在下一步重新加載)。

的問題,我們面臨:

  • 順序結構(XSD)與每一個版本的發展。因此XPath和自定義持久性經常會中斷併產生錯誤。
  • 我們結束了混合使用文檔和數據庫(因爲持久層無法保留文檔中的更改)。

表現並不是一個真正的問題(還沒有),因爲它是一個離線系統,訂單往往是故意延遲了幾天。

我不指望免費諮詢在這裏,但我是如何的辦法可以改善一個有點困惑(下一次,基本上)。

您認爲如何處理這些需求是一個很好的解決方案? 會使用對象圖,像JXPath和OGNL和OR映射器是更好的方法嗎?或者使用例如XML支持Oracle數據庫?

回答

1

如果您的架構變化的時候,我建議不要使用任何一種對象映射。你會不停地更改樣板代碼。

而是使用聲明性模式定義來驗證數據更改和訪問。 將訂單視爲單個數據,以XML文檔表示。 使用面向文檔的商店,如MongoDB,Cassandra或許多XML數據庫之一直接操作文檔。不要刻意將它分割成幾部分存儲在關係數據庫中。

通過關係數據庫中的報告工具訪問數據可能被認爲是次要的。例如,在MongoDB上進行簡單的map-reduce工作,可以根據需要將所需的訂單詳細信息填充到關係數據庫中,這很自然地將兩個用例分開。

1

標準Java EE的做法是代表你的數據作爲POJO和使用JPA的數據庫訪問和JAXB的對象從XML轉換成/。

JPA

  • 對象到關係標準
  • 由所有應用服務器廠商支持。
  • 多種可用的實現EclipseLink,休眠等
  • 強大的查詢語言JPQL(這是非常類似於SQL)
  • 處理查詢優化爲您服務。

JAXB

  • 對象到XML的標準
  • 所有應用服務器廠商的支持。
  • 提供多種實現:EclipseLink MOXy,地鐵,Apache的JaxMe等

+0

並且JXPath或ONGL將等同於XPath?我必須承認,我仍然要閱讀這些內容(但我會)。 – Elbonian 2011-02-04 21:01:59

+0

我的建議是將數據作爲代表您的域模型的POJO使用,並將XML表示形式另存爲連線格式。這將爲您提供基於標準的解決方案,您可以在任何地方部署。 – 2011-02-04 21:08:15