Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储元数据库_C#_Asp.net Mvc 3_Sql Server 2008_Entity Attribute Value - Fatal编程技术网

C# 存储元数据库

C# 存储元数据库,c#,asp.net-mvc-3,sql-server-2008,entity-attribute-value,C#,Asp.net Mvc 3,Sql Server 2008,Entity Attribute Value,在这个问题上,我和一位同事有些分歧。首先,环境(保证不会改变): SQL Server 2008 R2 ASP.NETMVC3 C# 现在,场景是:我正在开发一个应用程序,它将使用户能够从用户那里收集输入,并将其存储起来以供以后报告之用。收集输入的方法可以放在页面上的各种控件中。收集数据不是问题;储存它是一件好事 数据库中的数据库 我遵循的概念是,它应该存储为键值对的集合(在本例中,是一个名为ResponseItems)的表): 当ResponseId和FormItemId构成主键时,与Re

在这个问题上,我和一位同事有些分歧。首先,环境(保证不会改变):

  • SQL Server 2008 R2
  • ASP.NETMVC3
  • C#
现在,场景是:我正在开发一个应用程序,它将使用户能够从用户那里收集输入,并将其存储起来以供以后报告之用。收集输入的方法可以放在页面上的各种控件中。收集数据不是问题;储存它是一件好事

数据库中的数据库

我遵循的概念是,它应该存储为键值对的集合(在本例中,是一个名为
ResponseItems
)的表):

ResponseId
FormItemId
构成主键时,与
Response
表相关的
ResponseId
,如下所示:

+----------+------+------+-------------+
|ResponseId|FormId|UserId|SubmittedDate|
+----------+------+------+-------------+
以及与
FormItem
表相关的
FormItemId

+----------+------+----+-----------------+
|FormItemId|FormId|Type|InstantiationData|
+----------+------+----+-----------------+
其中,
FormId
Response
表中的
FormId
相同,引用了一个
表单
表,这一点并不重要

XML序列化

我得到的回应是,将表单组件和响应序列化为XML更有意义,因此它需要更少的表容量,只留下一个表单表:

+------+--------+
|FormId|Elements|
+------+--------+
所有实例化数据都存储在
元素
中每个表单元素的XML数据中。然后类似地记录响应:

+----------+------+-------------+----------------+
|ResponseId|UserId|SubmittedDate|ResponseElements|
+----------+------+-------------+----------------+
长篇序言后的简短问题

我认为第一个想法更干净,更容易报告。你觉得怎么样


最后请注意,对于这两个方面,都有更多的表,因为每次用户编辑表单时都要对表单进行版本控制。

第一种方法称为实体属性值(Entity Attribute Value,EAV)。在我看来,这从来都不是存储关系数据的好方法。在你采用这种设计之前,你应该先读一篇文章

在我的演讲和书中,我也谈到了EAV的缺点

在这两种设计中,我更喜欢XML方法。这基本上是马丁·福勒的模式


你可能还想读书。他们的方法并不特定于MySQL;它可以在SQL Server或任何其他RDBMS中工作。

就个人而言,我偏爱XML存储:)SQL Server 2008处理XML非常好,C#也是如此。对于您试图实现的目标,我认为XML比数据库更适合。数据库只是在为您存储XML……不过,我承认我对这一观点有偏见。事实上,您对此有偏见。您也知道,这比简化的布局复杂得多。:)是的,我非常清楚这个项目的复杂性…我期待着看到SO社区的一些建议。为什么这是个坏主意的简短版本是什么?这篇文章似乎很有趣,但并不完全相关,我也不太想买一本书作为答案。简短的版本是,这种形式的数据并不是一种关系,SQL的许多功能都无法正常工作。数据类型、约束、模式等都将退出窗口。您也可以将XML存储在一系列文件中,而不是RDBMS.FWIW中。每当我提到我的书时,我首先提供类似信息的免费来源。我不想成为一个垃圾邮件发送者,但我写这本书的目的是帮助人们解决与你一样的问题。我看了一下你的幻灯片演示,就明白了为什么使用EAV是一件危险的事情。如何使用另一种方法缓解XML数据的报告问题?如果要使用SQL进行报告,请将数据存储在离散列中,并自定义模式以适合您的数据。如果您将XML存储为序列化LOB,那么报告将由您在应用程序代码中实现。很抱歉,您不能取消模式,而期望SQL来完成这项工作。
+----------+------+-------------+----------------+
|ResponseId|UserId|SubmittedDate|ResponseElements|
+----------+------+-------------+----------------+