2011-06-30 31 views
4

我試圖設計一些數據庫表來存儲有關某些實體及其相關應用程序的配置設置。我能走得如此之遠,但卻遇到了「磚牆」。我會告訴你我的意思是...(不要把以下內容:圖片,作爲一個字面上的商業問題,圖片只是向你解釋我的問題的簡單方法)。數據庫模式設計 - 如何根據實體存儲特定的應用程序設置

標準

  1. 我們有圖片的目錄下載。
  2. 我們有幾個應用程序,可以 消費這些 圖片的任何數量。
  3. 我們想要配置如何在應用程序上顯示這些圖片 ,具體取決於

記住熊,每個程序都可以配置爲顯示畫面的具體和獨特的方式。

所以很明顯,我們需要2個表圖片,應用程序和一個結表以顯示MM的關係,儘可能多的圖片可以在許多應用中 - 見下:

enter image description here

我強調在紅色的「CONFIG_TABLE」列 - 我有一個非常強烈的懷疑,這是不好的,非常非常糟糕。據顯示,對於paricular應用程序,這是存儲在設置的配置表見下:

enter image description here

所以 - 有非常speicific應用程序的配置適用於圖片,這取決於你是什麼應用程序談論。現在假設設計被破壞了,因爲我相信它 - 我怎麼實際設計數據庫來正確地建模? (希望這是有道理的)

+0

告訴我,如果在app表中包含一個包含所有所需PIC_ID的配置表,那麼單獨的PICTURE_APP表的必要性是什麼?你是否也意識到CONFIG_TABLE列明顯違反了1NF? – mihsathe

+0

我知道這是明顯違規 - 這就是爲什麼我說它是一個破碎和糟糕的設計。PICTURE_APPLICATION表在那裏,因爲我想知道什麼圖片與什麼應用程序相關聯。 – Vidar

+0

假設在「名稱」上有一個唯一的約束,表「應用程序」在5NF。一些有問題的設計決定與標準化無關;這是其中之一。 –

回答

5

設計離正確不遠。你根本不需要application.config_table列。相反,每個應用程序應該知道哪個表與其自己的圖片使用有關。

因此,例如在PicManager應用程序,你可以這樣做:

SELECT p.*, c.* 
FROM Picture_Appliation AS pa 
INNER JOIN Picture AS p ON pa.pic_id = p.pic_id 
LEFT OUTER JOIN Picman_Config AS c ON p.pic_id = c.pic_id 
WHERE pa.app_id = 100; 

而且在其他各個應用程序的,你會在你的查詢代碼不同的配置表中。

不要試圖將其設置爲「自動」或「數據驅動」。只需編寫適合每個應用程序的代碼即可。您可以將數據驅動的方法用於數據值(例如app_id = 100),但不能使用代碼。數據是數據。代碼是代碼。

您可能只想編寫一個可用於所有應用程序的可重用類,但這是子類的用途。

+0

有呀!所以,就像我經常做的那樣,我讓事情變得比他們應該更復雜 - 現在你已經向我展示了第三種方式!,你所說的話是合理的。非常感謝比爾,我從來沒有想過以這種方式設計架構。 – Vidar

+0

是的,也請參閱http://stackoverflow.com/questions/1103299/help-me-understand-this-brian-kernighan-quote –

+0

感謝@BillKarwin和V對於這樣一個出色的問題和答案。我也在同一條船上,我需要爲我們的應用程序創建一個配置表,這給了我一個很好的開始pioint :)。 – Sizons