0

我正在使用 SQL Server。

我有一个表,其中有很多列,其中一部分没有在查询中使用。

我的问题是为什么不将它们作为 blob 或 XML 列保存到一列中?

是否有缺点或某种原因为什么不这样做?

4

4 回答 4

2

我总是告诉我的客户,数据存储领域的一切都是一种权衡。RDBMS 提供诸如持久性、隔离性、一致性和原子性(通常称为 ACID)之类的东西。但这是以相当复杂和严格的模式设置和维护要求为代价的,并且取决于您的数据,甚至性能。

您需要问自己(或您的利益相关者)是什么需要这些数据,在什么情况下需要访问它,在这种情况下您可以等待数据多长时间。然后你需要写下所有类似这样的解决方案的优缺点:

单独的列

  1. 针对完整性、性能、存储优化的关系存储
  2. DBA 的高维护开销
  3. 对架构进行昂贵的修改
  4. 完全符合 ACID

字符串 Blob

  1. 刚性存储,自动读取/搜索/修改成本高昂
  2. 简单的表模式
  3. 没有强制执行数据结构
  4. 查找数据非常慢
  5. 严格限制 ACID 特性

XML

  1. 可以强制实施模式的灵活存储
  2. 查找数据缓慢,可以通过索引改进
  3. 值可以直接查询
  4. 受限制的 ACID 属性
  5. 高存储开销

现在这还不是一个完整的列表。提到的一些要点也可能对一个项目有利,但对另一个项目不利。在你拥有所有的好处和缺点之后,应该更容易找出适合你的方法。

于 2013-06-25T13:33:19.837 回答
1

像往常一样,这取决于:)

例如:

  • 我目前将完整的服务器配置存储在一个 SQL 表 XML 字段中,我可以通过查询行键(1 个或最多 2 个字段)来检索该字段。它很有用,比参数的 n 个不同字段要好,但由于 xquery 的复杂性,它有点复杂。我可以在不违反最佳实践的情况下做到这一点,因为它是一个非常庞大的配置。我永远不会为“姓名地址”表这样做!

  • 在查询生成器(或 SP)背后的代码的情况下,更少的字段 = 更少的参数。

  • 小心使用 XML,您需要对其进行验证并检查是否存在空白、无效字符等。

  • 具有许多字段的 SQL 表非常适合存储和搜索。XML 适用于传输和格式化(到/从应用程序)。

记住:

“XML 不是数据库。它从来都不是数据库。它永远不会成为数据库。关系数据库是经过验证的技术,具有 20 多年的实施经验。它们是坚固、稳定、有用的产品。他们不会消失。XML 是一种非常有用的技术,用于在不同数据库之间或数据库与其他程序之间移动数据。但是,它本身并不是数据库。不要像一个人一样使用它。“</p>

于 2013-06-25T13:27:39.830 回答
1

如果此数据的唯一用例是应用程序服务器检索整个数据,那么显然它不是“多个值”而是一个值。哦,当然,客户端应用程序需要将字符串解析成几部分,但数据库并不关心。

因此,将其存储为单个列是非常合理的。

但是,您在评论中说:

“大部分信息由与数据库通信的应用程序服务器使用。我需要存储信息并获取信息,但我不需要按大多数列过滤结果”

“大部分”不等于“全部”。如果数据库必须对列的内容进行一些智能分析,那么您就有问题了,您应该将其存储为单独的列 - 如果必须的话,键/值对 - 或作为 XML。

于 2013-06-25T16:31:14.120 回答
0

我建议阅读有关数据库规范化的 Wikipedia 文章。根据具体情况,您可能会创建冗余,这将导致不一致或异常。

例如,想一想拥有 cd/mp3 收藏的人员列表。假设您将 CD 标题作为列表存储在一列中。在用 100 个条目填满列表后,您发现一个错字并修正了一个人的标题。由于时间不够,您没有修复其他问题(不一致)。

一段时间后,您会注意到您的数据库需要相当多的内存(仅作为示例)。查看您的条目,您会发现有几个人拥有相同的 CD。很明显,您多次存储相同的 cd 倾斜(冗余)。

于 2013-06-25T13:32:36.660 回答