2011-11-22 101 views
1

我在這個問題上與同事有點不同意。首先,環境(有保證的,不會改變):存儲元數據庫

  • SQL Server 2008 R2的
  • ASP.NET MVC 3
  • C#

而現在,這種情況下:我在一個應用程序上工作,這將使用戶能夠收集用戶的輸入並將其存儲起來用於以後的報告。收集輸入的方法是可以放在頁面上的各種控件。收集數據不是問題;存儲它。

數據庫中的數據庫

我按照它應該被存儲爲鍵值對的集合概念(在這個例子中,一臺名爲ResponseItems):

+----------+----------+----+-----+ 
|ResponseId|FormItemId|Name|Value| 
+----------+----------+----+-----+ 

在哪裏ResponseIdFormItemId構成主鍵,ResponseIdResponse表有關,因此:

+----------+------+------+-------------+ 
|ResponseId|FormId|UserId|SubmittedDate| 
+----------+------+------+-------------+ 

和與一個FormItemFormItemId

+----------+------+----+-----------------+ 
|FormItemId|FormId|Type|InstantiationData| 
+----------+------+----+-----------------+ 

哪裏FormId是一樣的,在ResponseFormId,引用Form表,這是不一樣重要說明。

XML序列化

我回來的應答序列化窗體組件和響應的XML更有意義,這樣,它需要在表計少批量,只留下一個形式表:

+------+--------+ 
|FormId|Elements| 
+------+--------+ 

以及所有實例化數據存儲在Elements中每個表單元素的XML數據中。響應被進行類似記載:

+----------+------+-------------+----------------+ 
|ResponseId|UserId|SubmittedDate|ResponseElements| 
+----------+------+-------------+----------------+ 

短期問題後,龍前言

我想到的第一個想法是更清潔和更容易報告。你怎麼看?

作爲最後一點,雙方都有更多的表格,因爲每次用戶編輯表單時都會對錶格進行版本控制。

+0

個人而言,我偏向於XML存儲:) SQL Server 2008很好地處理XML,C#也是如此。對於你想要達到的目標,我認爲XML比數據庫更適合。數據庫只是爲你儲存你的XML ....雖然,我承認偏向於這個觀點。 –

+0

確實,你偏向於此。你也知道這比簡單的佈局複雜得多。 :) – doctorless

+0

是的,我非常清楚項目的複雜性......我期待着看到SO社區的一些建議。 –

回答

3

第一種方法稱爲實體屬性值(EAV)。在我看來,這是從來沒有存儲關係數據的好方法。在採用該設計之前,您應該閱讀一篇名爲Bad CaRMa的文章。

我還在我的演示文稿Practical Object-Oriented Models in SQL和我的書SQL Antipatterns: Avoiding the Pitfalls of Database Programming中討論了EAV的缺點。

在這兩種設計中,我更喜歡XML方法。它基本上是Martin Fowler的Serialized LOB模式。您可能還想讀How FriendFeed Uses MySQL to Store Schema-less Data。他們的方法不是特定於MySQL;它可以在SQL Server或任何其他RDBMS中工作。

+0

爲什麼這是一個壞主意的簡短版本是什麼?這篇文章看起來很有趣,但並不完全相關,而且我也沒有真正有興趣賣出一本書作爲答案。 – doctorless

+2

簡短版本是這種形式的數據不是一種關係,因此SQL的許多功能停止按預期工作。數據類型,約束條件,模式等等都離開了窗口。您可能會將XML存儲在一系列文件中,而不是存儲在RDBMS中。 –

+3

FWIW,任何時候我提到我的書上SO,我第一次提供免費的類似信息來源。我不想成爲垃圾郵件發送者,但我寫了我的書來幫助那些與你的問題完全相同的人。 –