2011-11-22 39 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,我第一次提供免费的类似信息来源。我不想成为垃圾邮件发送者,但我写了我的书来帮助那些与你的问题完全相同的人。 –