Sql Server XML 列替代 Document DB?
Posted
技术标签:
【中文标题】Sql Server XML 列替代 Document DB?【英文标题】:Sql Server XML columns substitute for Document DB? 【发布时间】:2011-07-04 10:17:54 【问题描述】:是否可以使用 Sql Server XML 列代替真实的文档数据库(例如 Couch 或 Mongo)?
如果我要为文档创建一个带有 guid PK Id 和 XML 列的表。 与使用文档数据库相比,主要问题是什么?
Sql Server 支持对 XML 列进行索引,所以查询不应该是完全可怕的?
【问题讨论】:
非常好的问题!很长一段时间以来,我一直在使用 SQL XML 列作为一个糟糕的 NoSql 解决方案,并且效果很好。我一直很想尝试 mongo,但添加额外的基础设施不应该掉以轻心(备份策略、更新数据库本身、更新驱动程序......) 【参考方案1】:这里有几个问题:
是否可以使用 Sql Server XML 列来替代真实的 Document DB(例如 Couch 或 Mongo)? 是的,您可以使用它作为替代品,但不,您可能如果您只存储 XML 并且不利用任何 SQL Server 的关系工具,则不会对性能感到满意。
如果我要为文档创建一个带有 guid PK Id 和 XML 列的表。与使用文档数据库相比,主要问题是什么? 简而言之,就是向外扩展。 SQL Server 不能很好地扩展这种东西。您可以通过复制来做到这一点,但相对于“真实”文档数据库进行管理会很痛苦。
Sql Server 支持对 XML 列进行索引,所以查询不应该是完全可怕的吗? 问题是 SQL Server 的 XML 索引可能占用原始数据的存储空间数倍。这些索引无法在线维护(如碎片整理),因此您最终会在维护窗口期间遇到锁定问题。
【讨论】:
感谢您的详细回答。我目前正在一个小框架中尝试这个概念:Linq to Sql Xml -> rogeralsing.com/2011/02/28/linq-to-sqlxml 嗨布伦特,你能详细说明最后一句话吗? “这些索引无法在线维护(如碎片整理),因此您最终会在维护窗口期间遇到锁定问题。” 当然。根据您的 SQL Server 版本和版本,您可能无法在线重建索引,具体取决于所涉及的字段类型。【参考方案2】:我正在做一些实验: http://rogeralsing.com/2011/03/02/linq-to-sqlxml-projections/
查询速度“不错”,我不会用它来扩展。 但是在标准基础架构上运行无模式存储的乐趣是相当不错的。
【讨论】:
“在标准基础架构上运行的无模式存储”——我 100% 同意。对于不需要大规模的小型项目 - 我认为这是一个更好的权衡并降低系统复杂性,如果您已经有 sql。【参考方案3】:是的,你可以。将文档存储在 SqlServer XML 列中将起作用,并且如果您使用标准 XML 序列化,这将为您留下一个像样的 ACID 兼容键/值存储。此外,它将允许您相对轻松地对其进行查询,并且您可以将结果连接到您以更相关的方式存储的数据。我们这样做,它有效。如果将内容存储在 XML 字段中,存储需求比使用 NTEXT 低很多,并且查询会更加灵活和快速。
SqlServer 不会让您(与 mongo 相比)是副本集的无缝故障转移和 mongo 的自动分片。此外,像在文档深处增加特定属性这样的原子操作也很困难(尽管使用 XQuery 更新函数并非不可能)。大多数 NoSql 数据库的更新往往更快,因为它们在“数据仅在磁盘上是安全的”原则上更加宽松。
【讨论】:
【参考方案4】:是的,这是可能的。至于好不好用,这只是我的两分钱……
在 XML 数据类型出现之前,我曾在一个将 XML 存储在 NTEXT 列中的系统上工作 - 这并不令人愉快,并且要真正利用数据意味着将其中一些数据分解成关系形式。
好的,XML 数据类型现在使查询 XML blob 和提取某些值/索引它们变得更加容易。但就个人而言,一般来说,我不会。我并不是说永远不要使用 XML,因为存在这样的场景——如果这就是你的全部计划,那么我会想“这是适合这项工作的工具吗”。使用 RDBMS 作为文档数据库让我感到有些不安。而像 MongoDB 这样的东西是作为文档数据库从头开始构建的。
老实说,我还没有对将数据存储为 XML 进行任何性能测试,因此我无法告诉您性能如何。有兴趣知道这在规模上的表现如何。
【讨论】:
以上是关于Sql Server XML 列替代 Document DB?的主要内容,如果未能解决你的问题,请参考以下文章
动态获取 SQL Server 中不同列中的 XML 数据类型值