2009-02-19 42 views
11

我的應用程序配置非常分層,很適合單個XML。 很快(YAGNI,Yeh)這些信息的一部分將被其他應用程序遠程使用,這需要一個數據庫。Xml與數據庫的應用程序配置

因此,我開始設計數據庫表並將它們映射回我的應用程序的類層次結構(使用EF)。然而它成了維修的噩夢。

我很想聽聽別人的經驗,考慮到這個問題,謝謝。

+0

我看到這個問題仍然被高度關注,所以只是建議讀者檢查這種應用程序的NoSQL選項 – 2012-04-10 20:13:51

回答

17

我們對將配置存儲在長時間運行的應用程序(如網站和服務)的數據庫中有非常好的經驗。優點:

  • 您可以遠程安全(用戶/密碼)編輯配置
  • 這是簡單的應用程序自動或由信號拾取變化(select max(lmod) from config)(平網頁或創建空文件)
  • 應用程序只需要在每個環境(dev,test,prod)中配置一個配置項:要使用的數據庫。如果您有應用程序服務器,則您的應用程序可在所有環境中自由配置。

主要的問題是編輯,如果你有一個複雜的,分層的配置結構與默認值,列表和繼承。我們的解決方案:

  • 的配置表中有這些行:應用VARCHAR(32),主要爲varchar(512),價值爲varchar每環境(4096)
  • 一個DB(本地開發機,開發測試,集成測試生產)
  • 關鍵是分層(option.suboption ....名稱)
  • 默認使用 「選項。。名稱」(例如, 「JDBC。 .driver」 因爲我們只使用一種類型的數據庫)
  • 列表以字符串形式存儲,由換行符分隔。
  • 地圖以字符串形式存儲「name = value \ n」
  • 有一個可以從文件讀取配置(用於單元測試)的實現。將密鑰的每個層次映射到一個元素(......)

Config對象隱藏這些細節,所以應用程序只能用於對象。

一個特殊的類負責在發生變化時重新讀取配置。通常,我們會在一天中的某個時間更新配置,並且定時作業將在數小時後重新加載。這樣,我們永遠不需要同步配置方法。但是,備份和更改歷史記錄是一個問題。我們通過使用VCS中的XML文件修復了這些問題,然後「上傳」到數據庫。這樣,我們可以在上傳之前驗證生產配置(通過在開發人員機器上使用一組特殊的單元測試)。當它在夜間被激活時,它通常會立即工作,負責應用程序的操作員只需要做一點測試。

+0

您提供的解決方案非常巧妙。儘管如此,爲什麼不直接將XML存儲在數據庫中呢?而不是具有Application,Key,Value列的應用程序,XmlConfig列。這不會達到同樣的目的嗎? – Mas 2011-02-27 11:09:13

7

恕我直言配置應該生活在文件,文件適用於人和他們可以用於電腦。數據庫對於大數據非常適用,但對於人類來說卻是過火。這兩者通常是互相排斥的,當你嘗試將它們結合起來時,你會得到類似於註冊表的東西 - uggh。

爲什麼不將配置保留在文件中,並在其周圍構建DAL和服務層,以便您的應用程序可以使用它。假設你可以託管到一箇中央服務器上,如果沒有這個文件的多個副本的話。

0

使用數據庫(可能存儲此配置xml文件,如果您希望保留該格式)具有優勢 - 您可以記錄/審覈對配置的更改並執行備份和恢復。

基本上你的問題(我看到它的方式)把兩種東西,

  1. 的配置應該是什麼格式(XML,.ini文件等)
  2. 應在何處存儲(平磁盤上的文件,數據庫中的表格列)

您可以輕鬆地將config xml文件存儲在數據庫中,並提供編輯/顯示信息的界面。

+0

我基本上同意,但格式和地點有時是混合的,例如,數據庫不僅是一個位置,而且是查詢的便利媒介(「媒介,就是信息」) – 2009-02-24 06:13:11

0

配置文件應該是最容易處理的事情 - 所以把它們放到文件中。這樣,即使有記事本(如有必要),也可以通過這種方式進行更改。 數據庫確實是一種矯枉過正的情況,除非您希望您的配置駐留在某個全局服務器和所有實例中以共享它。

相關問題