哪一个使用?数据库中的EAV或Blob?

时间:2011-05-25 20:25:05

标签: asp.net sql-server xml database-design entity-attribute-value

我目前正在努力重新设计应用程序的数据系统。基本上,它的设计使人们可以添加他们想要的所有自定义字段,只有几个常量/总是在那里的字段。

我们目前的设计给我们带来了很多维护问题。我们所做的是动态地(在运行时)为每个字段向数据库添加一列。我们必须有一个元表和其他文件来维护所有这些动态列。

现在我们正在研究EAV,但它似乎并没有好转。基本上,我们有许多不同类型的字段,因此会有一个StringValues,IntegerValues等表...这会让事情变得更糟。

我想知道在数据库中使用JSON或XML blob是否是更好的解决方案,特别是因为在大多数用例中,当我们从这些表中检索任何内容时,我们需要整行。问题是我们需要能够为这些数据创建报告。没有解决方案真正使自定义查询看起来很容易。在报告运行时,搜索这样的blob数据库肯定会成为一场性能噩梦。

每个“行”需要有大约15到100个(可能更多)与之关联的属性/列。

我们正在使用SQL Server 2008,我们与数据库连接的应用程序是一个C#Web应用程序(因此,ASP.Net)。

你怎么看?完全使用EAV或blob或其他东西? (另外,是的,我知道像MongoDB这样的无架构数据库在这里会很棒,但我不能说服我的老板使用它)

4 个答案:

答案 0 :(得分:5)

xml数据类型怎么样?可以针对此类型进行高级查询。

我们使用了xml类型并取得了很好的成功。我们使用linq解析值,在代码级别完成大部分繁重工作。我们的架构有些固定,因此可能不适合您。

答案 1 :(得分:1)

SQL Server的一个有趣特性是sql_variant类型。它在.NET中完全支持并且非常易于使用。优点是您不需要创建StringValue,IntValue等...列,只需要一个可以包含所有简单类型的Value列。

这种非常特殊的类型有利于EAV选项,恕我直言。

虽然有一些缺点(排序,选择等等)。因此,如果您想使用它,请确保阅读所有文档并了解其限制。

答案 2 :(得分:0)

使用诸如DataColumn0001,DataColumn0002等顺序名称创建包含已知列和“X”稀疏列的表。当存在新列的定义时,只需重命名列并开始插入数据。稀疏列的最大优点是它是可索引的。

link的更多信息。

答案 3 :(得分:-5)

您正在做的是使用不支持您的数据类型的数据库的STUPID。您应该使用满足您需求的介质,包括NoSQL数据库,如RavenDB,MongoDB,DocumentDB,CouchBase或RDMBS中的Postgres等等。

你本身就是以一种既不是为其设计的容量使用该工具,也是一种特别试图限制你取得成功的工具。 NoSQL数据库解决方案经常使用JSON作为底层存储,因为JSON本质上是无模式的。想要添加房产?当然要继续,想要添加一个完整的子集合?好,去吧。 NoSQL数据库部分是专门为删除RDBMS的严格架构要求而创建的。

2015编辑:Postgres现在原生支持JSON。这是RDBMS的可行选择。我的答案仍然是正确的,您需要使用正确的工具来解决问题。这是一个聚合持久性世界。