2011-04-23 79 views
1

我必須設計一個模式來存儲具有許多屬性但很少共同的對象。數據庫設計 - 一個表中有許多字段,許多表中有一個字段或抽象表?

我在這裏找到了一些解決方案,但我仍然不相信要做的最好的事情。我看到這樣做的四種方式:

許多領域
  1. 一個表:這可能會導致許多NULL值,以及一個很難的時候,需要來添加一些屬性或modifiy一些數據類型。
  2. 爲每個屬性創建一個新表:這使得添加和更新列變得容易,並且保留了搜索功能,儘管每個SELECT都會導致很多JOIN
  3. 創建一個表中的每個物業類型,例如:標籤,數量,間隔等我不知道在這種情況下,如果我需要區分浮動,小數,整數等
  4. 創建抽象表(我在這裏讀取它稱爲Observation Pattern),它存儲屬性名稱和數據類型。

我應該遵循哪些標準,我應該回答哪些問題以在這些解決方案之間進行選擇?

感謝

+0

您是否考慮過使用[文檔數據庫](http://en.wikipedia.org/wiki/Document-oriented_database)而不是關係數據庫? – Oded 2011-04-23 18:58:06

+0

「這取決於」。除非有*證明需要*去其他路由之一(將* volatile *用戶定義的字典映射到表列上,否則我會留在#1中作爲「開發人員控制的模式」),通常是#1的輸出,但考慮稀疏列等)。應該注意「親吻」和「只做謹慎的事」。 – 2011-04-23 19:02:16

回答

0

這取決於你需要怎樣處理屬性。如果這些屬性只是間接利益,那麼4是一個非常靈活和緊湊的解決方案。間接利益是什麼意思?如果您需要檢索並顯示屬性中的信息,這是間接的。如果您需要使用屬性進行計算或詳細操作,那麼這更直接。換句話說,如果您可能在屬性上使用的唯一方法是「.ToString()」,那麼您可以使用4.該模式具有顯着的優勢,允許您在不更改數據庫的情況下添加新的屬性類型模式,因爲這些只是插入到屬性類型表中的新行。

如果另一方面,不同的屬性類型需要依賴於它們的數據類型進行操作,那麼將不同類型的屬性存儲在一個字段中將是一種痛苦。如果是這種情況,你可以做3.,但這也是一個問題,因爲它需要你知道要去哪個表來獲取特定類型的值。這不是一個不可逾越的問題,但它也不優雅。

而不是3你可以嘗試一種混合aproach,其中你的單個屬性表有多個列,每個數據類型一個,最好是另一列 - 可能是一個計算列 - 充當「ToString」。通過這種方式,您的間接使用可以轉到簡單且可預測的位置,只有您的更多參與應用程序需要擔心要爲特定屬性類型選擇哪個列。

1

我要說的是,這取決於你所使用的ORM技術和你的對象的序列化能力。

一般來說,我更喜歡抽象和靈活性。

相關問題