使用哪种?数据库中的EAV还是Blobs?

4
我目前正在重新设计我们应用程序的数据系统。基本上,它的设计是让人们可以添加他们想要的所有自定义字段,只有一些固定/始终存在的字段。
我们当前的设计给我们带来了很多维护问题。我们在运行时动态地向数据库中添加列以适应每个字段。我们必须有一个元表和其他琐碎的东西来维护所有这些动态列。
现在我们正在考虑使用EAV,但似乎也没有好多少。基本上,我们有许多不同类型的字段,所以会有StringValues、IntegerValues等表...这使得情况更糟。
我在想,在数据库中使用JSON或XML blob可能是一个更好的解决方案,特别是因为在大多数情况下,当我们从这些表中检索任何内容时,我们需要整个行。问题是我们还需要能够为这些数据创建报告...没有什么解决方案真的让自定义查询变得容易。而且在运行报告时,跨这样一个blob数据库进行搜索肯定会是性能噩梦。
每个“行”需要与之关联的属性/列数量从大约15到100(可能更多)不等。
我们正在使用SQL Server 2008,我们的应用程序与数据库的接口是一个C# Web应用程序(因此是ASP.Net)。
你认为呢?使用EAV还是blobs或完全不同的东西?(另外,是的,我知道像MongoDB这样的无模式数据库在这里会很棒,但我无法说服我的老板使用它)
4个回答

5

XML数据类型怎么样?对这种类型进行高级查询是可行的。

我们已经成功地使用了XML类型。我们在代码层面上使用LINQ来解析出值,这样可以帮助我们完成大部分工作。我们的模式有些固定,所以这可能不适用于您。


我会进一步研究并与我的老板讨论,但看起来这正是我们所需要的。 - Earlz
另一个选项是使用FOR XML从关系表中返回XML,并且您可以在对象级别反序列化它。 - ScottE

1

SQL Server 的一个有趣特性是 sql_variant 类型。它在 .NET 中得到了完全支持,而且使用起来相当容易。优点是您不需要创建 StringValue、IntValue 等列,只需一个 Value 列即可包含所有简单类型。

这种非常特殊的类型更适合 EAV 选项,我个人认为。

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


0
创建一个表格,其中包含您已知的列和“X”稀疏列,使用顺序名称(例如DataColumn0001,DataColumn0002等)。当有新列的定义时,只需重命名一列并开始插入数据。稀疏列的巨大优势在于它是可索引的。
更多信息请参见link

100个稀疏列看起来不太好...而这基本上就是我们现在正在做的,最终会变成一个维护噩梦。 - Earlz

-5

你正在使用一个不支持你的数据类型的数据库,这样做是愚蠢的。你应该使用符合你需求的中介工具,包括RavenDB、MongoDB、DocumentDB、CouchBase或Postgres等NoSQL数据库。

你本质上是在使用一个既不是为此设计的工具,而且它还试图限制你取得成功的能力。NoSQL数据库解决方案通常使用JSON作为底层存储,因为JSON本身是无模式的。想添加属性?当然可以,想添加整个子集合?当然可以。NoSQL数据库在某种程度上是专门为了消除关系型数据库的严格模式要求而创建的。

2015年更新:Postgres现在原生支持JSON。这是关系型数据库管理系统的可行选项。我的答案仍然正确,你需要使用正确的工具来解决问题。这是一个多语言持久化的世界。


1
你的回答对这个问题来说很愚蠢。 - JNK
2
请阅读我问题的最后一句话。我注意到非关系型数据库会很棒,但目前我被迫使用SQL Server。 - Earlz
5
@Chris - 实际上这不是正确的答案,因为它没有回答提问者的问题。他说,在他受限于SQL Server的情况下,什么是最好的解决方案。你可以问“什么是最快的美国汽车?”,我可以说“买一辆布加迪威航,它是最快的!”这是准确的,但并没有回答问题。 - JNK
3
@Chris - 公平的说,但是威龙仍然不是问题的正确答案。 - JNK
1
“狂热者是那些无法改变他们的想法,也不会改变话题的人。”- 温斯顿·丘吉尔 - Bill Karwin
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接