2012-08-01 54 views
0

我們的應用程序有許多配置指令。諸如「是否啓用了多種語言?」「哪個CSS模板應該使用?」 「」每頁應顯示多少項目?「將配置保存到數據庫 - 鍵值存儲

我們需要在DB中存儲配置指令。目前我們有配置的每個「區域」的表,並且該表只有一行包含列中的值。這種方法允許我們對這些值施加約束 - 讓它成爲ENUM,INT,VARCHAR等等。但是當我們需要添加新的配置指令時,它是巨大的PITA--我們需要更新和重新部署數據庫模式。它也污染了許多表格的setup_something表空間。

我的想法是用基於MySQL的鍵值存儲替換表(我們使用帶有小配置選項的共享主機,所以我們不能使用NoSQL)。其中一些值可能依賴於語言環境或其他變量,但我認爲它可以通過類似於後備(類似於「lang:fr」開頭的鍵來解決,如果沒有找到,試着用「lang:default」開頭(這會總是準備好)。

約束只會用具體的設置類進行檢查在PHP,但不會有DB檢查。

  1. 是否對此有任何現成的解決方案(prefferably與運作良好Zend Framework)
  2. 這個解決方案的祕訣是什麼(除非明顯 - 我不能一次獲取整個「行」或同時獲取多行 - 這不是問題)
  3. [你使用過|你會使用]類似的解決方案還是完全不同的東西?
+0

爲什麼不使用帶有鍵/值對的一個表?如果是按用戶配置,則始終可以使用用戶/鍵/值作爲表數據。 – Matt 2012-08-01 14:39:05

+1

如果您不需要從Web應用程序(例如管理界面)寫入/更改參數,我會在文本文件中使用某些內容。像yaml或ini風格的配置。現有的解決方案/ PHP庫無法解決這個問題。 – bcelary 2012-08-01 14:40:16

+0

這是我的第一個想法。但是我想先將衆包體驗:)可能會有一些不可預見的陷阱;) – 2012-08-01 14:41:43

回答

2

你可以簡單地擁有一個MySQL表格,包含所有的配置設置。也許是這樣的:

config_id (INT autoincrement) 
config_group (VARCHAR) this gives you something to group your configuration setting with 
config_key (VARCHAR) this would be the key name by which you would reference the value 
data_type (VARCHAR) you can use this to tell your application how you want to treat this data within the application (i.e. treat it as integer, float, string, etc.) 
value (VARCHAR) the value 

當然,那麼你就需要採取的字符串值和操作它在你的代碼把它當作一個整數,浮點,字符串等

也許注意清潔做事情的方式,但已經看到這種做法多次。

2

Wordpress系統(當然使用MySQL)有一個wp_options表。它包含以下列:

option_id (autoincrement pk) 
blog_id  (parameter grouping number) 
option_name (text of option name) 
option_value (text of option value) 
autoload  ('yes' or 'no') 

option_value可以是簡單數字(0,1,42)或根據需要的文本字符串。一些option_value項目是可解析的類似JSON的序列化參數集。

自動載入列允許您的系統在需要時跳過少量使用的設置。

這工作得很好,並提供了很大的靈活性。

0

將您的鍵/值存儲在php數組中,將其序列化並將結果字符串存儲在數據庫表的文本列中。很多靈活性和易於實施。唯一不好的一面是你無法查詢單個屬性。

+0

這不是一個選項,選項需要可讀來自SQL。 – 2012-08-02 07:01:03