【问题标题】:Why not to store multiple values in one columns in SQL Server?为什么不在 SQL Server 的一列中存储多个值?
【发布时间】:2013-06-22 07:11:56
【问题描述】:

我正在使用 SQL Server。

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

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

有什么缺点或者什么理由不做吗?

【问题讨论】:

  • 如果您(或任何人)将来必须查询它们怎么办?
  • 可以说我确信没有人会询问他们。
  • 如果没有人会查询它们,那么删除它们可能会更简单。我不太了解您的要求,但不能肯定地说。
  • 大部分信息由与数据库通信的应用程序服务器使用。我需要存储信息并获取信息,但不需要按大多数列过滤结果
  • 同样的故事。如果您继续检索部分信息,那么为了获取隐藏在其末尾的微小整数而不断读取 blob/解析 XML 将是昂贵的。但是,如果您总是需要检索整个信息包,那为什么不呢。

标签: sql-server xml database blob


【解决方案1】:

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

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

单独的列

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

字符串 Blob

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

XML

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

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

【讨论】:

    【解决方案2】:

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

    例如:

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

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

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

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

    记住:

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

    【讨论】:

    • 数据库基本是数据存储。通过查询搜索信息是主要工具,但并非适用于所有场景。在这种情况下,我只需要在 diff 列中存储信息并仅按 ID 获取行,因此我不需要从数据库访问 xml/blob 列,只需按请求缓冲信息。
    【解决方案3】:

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

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

    但是,你在评论中说:

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

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

    【讨论】:

      【解决方案4】:

      我建议阅读database normalisation 上的维基百科文章。 根据具体情况,您可能会创建冗余,这将导致不一致或异常。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多