2010-03-08 69 views
5

有人建議移動臺充滿設置,其中,每個列是一個設置名稱(或類型),並且行是客戶&其每個設置相應的設置。表設計SystemSettings,最佳模式

ID | IsAdmin | ImagePath
------------------------------
12 | 1                     | \ path \ to \ images
34 | 0                     | \ path \ to \ images

這個缺點是每當我們想要一個新的設置名稱(或類型)時,我們都會改變表格(通過sql)並添加新的(列)設置名稱/類型。然後更新行(以便每個客戶現在具有該設置的值)。

新表設計方案。建議是有一個設置名稱的列和另一個設置列。
ID |設置名稱| SettingValue
----------------------------
12 | IsAdmin               | 1
12 | ImagePath       | \ path \ to \ images
34 | IsAdmin               | 0
34 | ImagePath       | \ path \ to \ images

他們提出的一點是,添加一個新的設置就像插入一條簡單的聲明到行一樣簡單,沒有添加列。

可是,我感覺不對關於第二個設計,它看起來不錯,但我不能想出反對任何參數。我錯了嗎?

回答

2

這是一個「Entity Attribute Value」模式(Joelrandom SO question

它有幾個優點和缺點多的變化,它幾乎保證在眼淚中收場。

+0

我認爲在設置上使用EAV是可以的。圍繞EAV設計完整的數據庫是一個完全不同的故事,而不是OP詢問的內容。但是我沒有看到從你的角度來看,根本不同的文檔數據庫是怎麼樣的,我也不明白爲什麼使用它們會得到保證。 – 2010-03-08 18:30:18

+0

@Johannes Rudolph:對於一個簡單的系統設置表,那麼是的。就像web.config中的appsetting,說。但是,像web.config一樣,您可以使用專用部分來進行更復雜的設置:您不會擴展應用程序。最終,情況會變得更糟,因爲有人會認爲「這是一個好主意」。說,我已經使用它們,但你必須要小心...... – gbn 2010-03-08 18:39:31

+0

感謝您的領導這是一個(粗糙)版本的EAV,在鏈接和谷歌之間,我應該得到的東西。參照完整性似乎確實存在一些問題。比如創建一個設置DefaultReportID,10在1到9的報表中存在。 – 2010-03-08 21:25:15

1

第二種方法實際上類似於字典。我發現這對於我正在爲您提到的原因而開發的應用程序來說是更方便的選擇。這種方法有一些注意事項,所以你需要注意它們:

  • 保持你的關鍵字符串是靜態的,永遠不會重命名。
  • 確保每個設置字典檢索您的時間將其更新到最新版本(通常通過添加鍵和設置默認值/提示用戶)。
  • 混合字符串和例如十進制數據,您需要選擇一個或提供多個可爲空的列,以便可以以適當的格式存儲數據。將元數據放在某處。
  • 處理字典的代碼應該以強類型方式包裝它,絕不要將它作爲真正的字典(在數據結構的意義上)公開,而是提供一個類。
+0

我注意到它也是字典,它最終可能最好包裝在一個散列中,設置名稱作爲鍵和值作爲值(作爲對象鍵入,但會打開另一個蠕蟲)。感謝您的意見。 – 2010-03-08 19:23:39

0

使用列名來區分設置通常是一個可怕的想法。你正在處理的實體是SETTING,它具有屬性NAME和VALUE。如果您需要在不同的上下文中使用相同的名稱,請設置SETTING分層結構,即除根之外的每個設置都會獲得一個父級。然後,您的客戶可以將根作爲他們的父母,並且每個客戶下的路徑對於每個設置都是相同的。如果需要,您可以使用不同的列來添加其他數據類型。

相關問題