何时使用XML数据类型


12

我负责在项目上创建数据库。我们的字段很少会具有值(每10,000条记录中有1个),我正在尝试找出将其存储在数据库中的最佳方法。

据我所知,我有3种选择:

  1. 在表格中为每个附加值添加一列
  2. 添加一个链接表,该表引用原始表,并且仅在需要存储值的位置才有记录
  3. 在原始表中使用XML数据类型,并在其中存储所有值。

还有其他我没有考虑的选择吗?

我正在尝试找出每种方法的利弊。据我所知,1是最简单的,2将占用最少的空间,但是我一直在努力寻找3的许多资源。


1
要在数据库中添加针对xml滥用的个人言论,我将直接回答标题中的问题,然后大声说:永远!对于实际问题,我将让同事们帮助您,因为您已经有了很好的答案:-)。PS:您实际上可以忽略我的第一句话。
玛丽安

您在谈论几个额外的领域?它们成为同一实体的一部分有意义吗?
安德鲁·比克顿

Answers:


12

听起来您需要的是稀疏列过滤后的索引,并带有选项1。在此情况下,这些功能是完全受支持和记录的功能。

SQL Server数据库引擎在列定义中使用SPARSE关键字来优化该列中值的存储。因此,当表中任何行的列值均为NULL时,该值无需存储。

我无法想象在这种情况下XML解决方案会表现良好,它将有大量的冗余元数据开销,并且查询速度会很慢。


1
我认为稀疏列是我的追求。我期望将少量数据存储在某些表的少数列中。
马修·史蒂普斯

我不确定我是否阅读正确,但是根据此链接,稀疏列基本上是我一直在寻找的3种数据库实现,不是吗?blog.sqlauthority.com/2008/07/14/…–
马修·

如果它是在内部实现的(我不知道那是某人的博客),那么您将不必自己处理或解析XML-它的行为完全像是带有(有任何限制的)常规表关于数据类型)
Gaius

5
  1. 如果SQL Server中的长度可变,则可为空的列将占用空间。NULL的事实存储在NULL位图中。您可以根据需要使用过滤后的索引为其建立索引,以便忽略NULL列。

  2. 考虑第1点时会增加复杂性。

  3. 别。难以搜索,解析等:您稍后后悔

这也取决于大小:几十亿行是否为char(1000)?还是tinyint可以容纳10万行?如果后者考虑了点2所增加的复杂性,则不值得。


您是否有一个引用,可为空的null列不占用空间。我知道它是否为空存储在空位图中,但是对于固定长度字段,我认为数据仍存储在表中。我将用于大多数这些值的数据类型是金钱(所以是8个字节)
Matthew Steeples

1
@Matthew Steeples:我说可变长度已经没有空间了。供参考sqlskills.com/BLOGS/PAUL/category/On-Disk-Structures.aspx#p41这8个字节如何排成行?
gbn

目前,我们有50万行,但如果我们能够正常生活,那么我们将以每周约100万的速度(希望)进行扩展。
马修·斯蒂夫斯


-4

第四个选择:不使用表格。表格非常不适合此类数据(实际上,不适用于尚未强制拟合为表格形式的任何类型的数据)。只需使用XML。


3
-1是“不使用表”的选项,这的确很明显,答案显然是针对表结构提出了异议,实际上并未提交有用的答案。
安德鲁·比克顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.