在SQL Server数据库中将数据保存为XML?

时间:2009-11-23 23:42:51

标签: .net sql-server xml

我正在为垂直市场开发WPF应用程序。在今天讨论如何构建数据结构以支持选择十几个复选框和单选按钮时,我想到了将对象序列化为XML并将其存储在SQL Server中的可能性,然后在需要数据时对其进行反序列化显示。

我的问题是关于在SQL Server 2008中存储XML。我的同事认为这种方法是一个坏主意,并提出了使用通用列表表来存储名称 - 值对中的数据的可能性。

在SQL Server 2008中存储XML数据的优缺点是什么?我是不是想到了这个,还是我在做什么?

2 个答案:

答案 0 :(得分:4)

空间使用

与NVARCHAR(N)存储相比,XML存储占用的空间更少。其中一个原因是,XML数据类型将元素/属性名称转换为内部标识符并存储ID而不是元素名称。这节省了大量的存储空间。

例如,请查看以下示例:

DECLARE @x NVARCHAR(MAX)
SELECT @x = '
  <Employees>
    <EmployeeFirstNameLastNameandMiddleName>Jacob v Sebastian</EmmployeeFirstNameLastNameandMiddleName>
    <EmployeeFirstNameLastNameandMiddleName>Someone x somewhere</EmployeeFirstNameLastNameandMiddleName>
  </Employees>'

测试:

SELECT DATALENGTH(@x) AS Length

结果:

Length
------
498

...对:

DECLARE @x1 AS XML
SELECT @x1 = CAST(@x AS XML)
SELECT DATALENGTH(@x1) AS Length

结果:

Length
------
218

请注意,NVARCHAR版本占用498个字节,XML版本仅占用 218 字节。

效果

一般来说,XML可能会为您提供更好的性能。但是,取决于对数据的使用。如果需要查询XML值并从节点/属性中提取信息,XML将为您提供最佳性能。如果使用NVARCHAR,则需要在运行时将值转换为XML,这将增加查询处理器的开销。

其次,较小的尺寸意味着在读写时需要的IO较少。这可以直接转化为性能提升。

如果仅为了存储而存储数据,并且在XML文档中没有进行查询操作,那么将数据存储为VARBINARY可能是更好的选择。这可能会提供更好的性能,因为SQL Server在存储和读取数据时不需要执行与XML相关的验证和格式化。

NVARCHAR与VARBINARY

如果您不想将数据存储为XML,那么您的下一个最佳选择是VARBINARY(MAX)。将值存储在NVARCHAR中可能会导致编码相关问题。

取自帖子here


我不得不承认,为了动态布局表单,通过xml进行管理会更加困难,你可以将其存储在数据库中,而不是使用数据库中的键/值对。

答案 1 :(得分:0)

我看到的问题是XML是一种存储介质,SQL Server也是如此。因此,您将数据存储在一个介质中,然后将其存储在另一个存储介质中。

你能不能跳过中间人并创造一张桌子?之一:

  • 像同事建议的键值对或
  • 包含十几列的表格,表格中每个选项都有一列。

后者允许从sql server轻松地将数据绑定到表单。