我负责在项目上创建数据库。我们的字段很少有值(每 10,000 条记录中有 1 个),我正在尝试找出将其存储在数据库中的最佳方法。
据我所知,我有 3 个选项:
- 在表中为每个额外值添加一列
- 添加一个链接表,该表引用原始表并且仅在我们需要存储值的地方有记录
- 使用原始表中的 XML 数据类型并将所有值存储在其中。
还有其他我没有考虑过的选择吗?
我正在尝试找出每种方法的优缺点。据我所知,1 将是最简单的,2 将占用最少的空间,但我正在努力为 3 找到许多资源。
我负责在项目上创建数据库。我们的字段很少有值(每 10,000 条记录中有 1 个),我正在尝试找出将其存储在数据库中的最佳方法。
据我所知,我有 3 个选项:
还有其他我没有考虑过的选择吗?
我正在尝试找出每种方法的优缺点。据我所知,1 将是最简单的,2 将占用最少的空间,但我正在努力为 3 找到许多资源。
听起来您需要的是稀疏列和过滤索引,并使用选项 1。这些完全支持并记录在此场景中的功能。
我无法想象 XML 解决方案在这种情况下表现良好,它会产生大量冗余元数据开销并且查询速度会很慢。
如果 SQL Server 中的长度可变,则可为空的列不占用空间。为 NULL 的事实存储在NULL 位图中。如果需要,您可以使用过滤索引对其进行索引,这样您就可以忽略 NULL 列。
考虑第 1 点时会增加复杂性。
不。难以搜索、解析等:你以后会后悔的
它还取决于大小:这将是数十亿行的 char(1000) 吗?还是 100k 行的 tinyint?如果后者考虑第 2 点增加的复杂性:不值得。
在 SQL Server 2008 中,您可以选择使用稀疏列,这些列专为您提到的情况而设计。
它们还有一个额外的好处,您可以使用 XML COLUMN_SET 将它们视为组合的 XML 对象或单独引用它们,它们提供了巨大的空间节省。
查看以下博客文章了解更多详细信息: http ://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx
第四种选择:不要使用表格。表格非常不适合这种数据(实际上,对于任何没有被强制放入表格形式的数据)。只需使用 XML。