我正在使用 SQL Server。
我有一个表,其中有很多列,其中一部分没有在查询中使用。
我的问题是为什么不将它们作为 blob 或 XML 列保存到一列中?
是否有缺点或某种原因为什么不这样做?
我正在使用 SQL Server。
我有一个表,其中有很多列,其中一部分没有在查询中使用。
我的问题是为什么不将它们作为 blob 或 XML 列保存到一列中?
是否有缺点或某种原因为什么不这样做?
我总是告诉我的客户,数据存储领域的一切都是一种权衡。RDBMS 提供诸如持久性、隔离性、一致性和原子性(通常称为 ACID)之类的东西。但这是以相当复杂和严格的模式设置和维护要求为代价的,并且取决于您的数据,甚至性能。
您需要问自己(或您的利益相关者)是什么需要这些数据,在什么情况下需要访问它,在这种情况下您可以等待数据多长时间。然后你需要写下所有类似这样的解决方案的优缺点:
单独的列
字符串 Blob
XML
现在这还不是一个完整的列表。提到的一些要点也可能对一个项目有利,但对另一个项目不利。在你拥有所有的好处和缺点之后,应该更容易找出适合你的方法。
像往常一样,这取决于:)
例如:
我目前将完整的服务器配置存储在一个 SQL 表 XML 字段中,我可以通过查询行键(1 个或最多 2 个字段)来检索该字段。它很有用,比参数的 n 个不同字段要好,但由于 xquery 的复杂性,它有点复杂。我可以在不违反最佳实践的情况下做到这一点,因为它是一个非常庞大的配置。我永远不会为“姓名地址”表这样做!
在查询生成器(或 SP)背后的代码的情况下,更少的字段 = 更少的参数。
小心使用 XML,您需要对其进行验证并检查是否存在空白、无效字符等。
具有许多字段的 SQL 表非常适合存储和搜索。XML 适用于传输和格式化(到/从应用程序)。
记住:
“XML 不是数据库。它从来都不是数据库。它永远不会成为数据库。关系数据库是经过验证的技术,具有 20 多年的实施经验。它们是坚固、稳定、有用的产品。他们不会消失。XML 是一种非常有用的技术,用于在不同数据库之间或数据库与其他程序之间移动数据。但是,它本身并不是数据库。不要像一个人一样使用它。“</p>
如果此数据的唯一用例是应用程序服务器检索整个数据,那么显然它不是“多个值”而是一个值。哦,当然,客户端应用程序需要将字符串解析成几部分,但数据库并不关心。
因此,将其存储为单个列是非常合理的。
但是,您在评论中说:
“大部分信息由与数据库通信的应用程序服务器使用。我需要存储信息并获取信息,但我不需要按大多数列过滤结果”
“大部分”不等于“全部”。如果数据库必须对列的内容进行一些智能分析,那么您就有问题了,您应该将其存储为单独的列 - 如果必须的话,键/值对 - 或作为 XML。
我建议阅读有关数据库规范化的 Wikipedia 文章。根据具体情况,您可能会创建冗余,这将导致不一致或异常。
例如,想一想拥有 cd/mp3 收藏的人员列表。假设您将 CD 标题作为列表存储在一列中。在用 100 个条目填满列表后,您发现一个错字并修正了一个人的标题。由于时间不够,您没有修复其他问题(不一致)。
一段时间后,您会注意到您的数据库需要相当多的内存(仅作为示例)。查看您的条目,您会发现有几个人拥有相同的 CD。很明显,您多次存储相同的 cd 倾斜(冗余)。