2009-03-05 39 views
3

我爲包含用戶設置的應用程序設計了一個數據庫。該數據庫將預裝幾個系統用戶設置。這些可能會隨着版本的不同而改變。我應該如何處理更新這些設置?'系統數據'應該在數據庫中嗎?

我想出瞭解決方案:

  1. 應用的布爾「系統」字段設置表和替換所有的系統設置時,對數據庫的修改版本號。 (在設計這些設置時非常煩人,因爲在開發過程中必須不斷擦除數據庫)
  2. 不要將系統設置放入數據庫,並在查詢數據庫時以某種方式合併系統數據與數據庫中的數據。

目前我正在做第一次,但第二次似乎更合適。我應該怎麼做,以及如何在使用Microsoft Entity Framework時無縫地將外部數據與數據庫中的數據相結合?

+0

什麼是「系統用戶設置」?你的意思是默認的用戶設置? – 2009-03-05 09:30:12

回答

1

由於存在大量的操作,您最終可能希望對數據執行超出簡單聯合(內部和外部聯接以查看誰匹配系統設置或不想到)我建議將系統數據與用戶數據結構相同。

這還允許在用戶沒有特定值時從系統數據填充默認值等行爲。

如果您有時間閱讀相當長的內容,關於管理設置和覆蓋this blog post有一些有趣的觀點。

0

我會首先加載用戶的默認值,然後加載頂部的用戶自定義值。這樣,您仍然可以更改默認設置,但如果用戶更改了特定設置,則不會丟失它。

0

我不確定你想用1)實現什麼,但我可以回答2)。

所有生成的實體類都是局部類,所以你可以用你自己的屬性和方法來擴展它們。所以你可以添加一個額外的屬性到一個從外部源獲取數據的實體(例如配置文件)。

現在,這可能不是最好的解決方案,因爲無法一次獲取所需的所有信息(例如,在檢索大量實體時)。

0

我不確定這是否真的得到你的問題,但我認爲這是一個有趣的小數據庫練習。假設你有一個名爲「設置」的表,你在#1建議:

+------------+--------------+-----------+---------------+ 
| setting_id | setting_name | is_system | setting_value | 
+------------+--------------+-----------+---------------+ 
|   3 | foo   |   1 | Blue   | 
|   4 | foo   |   0 | Red   | 
|   5 | bar   |   1 | Green   | 
|   6 | baz   |   1 | Yellow  | 
|   7 | baz   |   0 | Orange  | 
|   8 | quux   |   0 | Purple  | 
+------------+--------------+-----------+---------------+ 

的主鍵將是對setting_id和唯一約束應用於列setting_nameis_system(這是布爾值)。

要查找所有的當前活動(假設用戶設置覆蓋系統設置)的設置,下面的查詢將做的工作:

SELECT setting_name, setting_value 
FROM setting s 
WHERE is_system = (
       SELECT MIN(is_system) 
       FROM setting si 
       WHERE s.setting_name = si.setting_name 
     ); 

運行查詢產生這樣的結果:

+--------------+---------------+ 
| setting_name | setting_value | 
+--------------+---------------+ 
| foo   | Red   | 
| bar   | Green   | 
| baz   | Orange  | 
| quux   | Purple  | 
+--------------+---------------+ 

因此,如果存在用戶設置,則會提取它,否則將使用系統默認值。

以這種方式使用MIN()函數是對布爾值操作的一種反常方式,但它很簡單。

相關問題