我正在玩并学习使用Microsoft SQL Server。我想将XML文档存储在表中,不会在表中修改部分XML文档(即,任何更改都将通过更新该单元中的整个XML文档来完成)。
从我所看到的,我可以将XML文档存储在Xml类型的列或varchar(MAX)中。
各自的优点和缺点是什么?
答案 0 :(得分:6)
XML数据类型支持:
此外,使用XML类型,你很难做到初级开发人员在处理XML时遇到的典型错误:将其作为字符串威胁,混合或忽略UTF8和UTF16等编码,忽略命名空间,混淆或忽略处理指令等等。
答案 1 :(得分:4)
是的,你可以。
现在,继续阅读文档。关于更好地搜索XML的部分 - 您可以在XML字段上放置一个索引,它将允许您比XML文本字段更多的特定于XML的查询语法,因为XML字段在内部解析XML。
答案 2 :(得分:3)
引自以下SO帖子:Microsoft SQL Server 2005/2008: XML vs text/varchar data type
如果将xml存储在xml类型列中,则不会存储数据 作为简单文本,如在nvarchar情况下,它将存储在一些文本中 解析数据树的类型,而后者将小于 未解析的xml版本。这不仅减少了数据库大小,而且 为您提供其他优势,如验证,易操作等。 (即使你没有使用其中任何一个,他们仍然在那里 未来的使用)。
另一方面,服务器必须解析数据 插入,这可能会减慢你的数据库 - 你必须 做出速度与尺寸的决定。
就个人而言,我认为数据库中的数据应该存储为xml 只有当它具有在关系中难以实现的结构时 模型,例如布局,样式描述等通常意味着 没有太多的数据和速度不是问题,因此添加了xml 功能,如数据验证和操作能力(也是,最后 但并非最不重要的是,能够点击管理工作室中的价值 并看到格式化的xml - 我真的很喜欢这个功能!),超重了 成本。
我没有直接存储大量xml的经验 数据库,如果我有选择,我不会这样做,因为它是 几乎总是慢一个关系模型,但如果那将是 case,我建议分析两个选项,并在大小之间进行选择 和速度最适合您的需求。
答案 3 :(得分:1)
我做了一些测试来比较无类型XML,类型化XML和NVARCHAR(MAX)之间的插入性能。我发现XML是禁食的,并且在磁盘上使用的存储空间最小。我做的测试,插入7,936,510行。它在https://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd使用了XSD。
我运行了两次类型化的XML测试。第一次采取01:23:26.1355961。我第二次参加01:15:15.5957446。磁盘大小为57,520,685,056。
无类型的XML测试占用了00:48:48.6290364,在磁盘上为36,515,610,624。
NVARCHAR(MAX)测试时间为00:50:22.1841067,磁盘上为72,620,179,456。
注意,我删除并重新创建了每个测试的数据库。
我对此的看法是,最好使用无类型XML而不是NVARCHAR(MAX),因为它使用的磁盘少得多。也许如果您只使用非Unicode VARCHAR,那就不那么重要了。我认为它可能使用两个字节来存储每个字符。但是,文件中还有很多空格。所以那里存在很多浪费的存储空间。所以,这可能与它有关。
我不确定使用类型化XML与非类型化XML相关的额外缓慢程度有多少是由于验证,或者,如果存在其他差异。如果我没记错的话,我曾经读过数据存储在隐藏表中的关系。我不确定它是否适用于类型化和非类型化的XML。
我还没有测试过查询性能。我假设键入的XML会更快。
另外,我指定键入的XML是DOCUMENT,而不是默认的CONTENT。
答案 4 :(得分:0)
1.它基于标准:SQLXML,因此您可以期望其他主要数据库具有类似的功能。
2.Queries可能使用XPATH等标准
3.您可以索引数据
4.如果您有数据存储架构(更少)并且基于类型信息执行查询优化
答案 5 :(得分:0)
缺点: 如果要将结构化xml数据存储在xml数据字段中,则复制当前不会同步发布者和订阅者之间的更改。
e.g。如果订阅者更改了一个xml元素,并且发布者更改了同一个xml数据列的另一个元素,则会发生冲突 - 一个会丢失,您必须手动找到丢失数据的解决方案。
优点: 许多Web /桌面应用程序将其数据存储为xml数据类型 - 这可以很容易地映射到sql xml数据类型。