为什么不在SQL Server的一列中存储多个值?

时间:2013-06-25 13:07:01

标签: sql-server xml database blob

我正在使用SQL Server。

我有一个包含大量列的表,其中部分列未在查询中使用。

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

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

4 个答案:

答案 0 :(得分:2)

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

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

单独的列

  1. 针对完整性,性能,存储进行了优化的关系存储
  2. DBA的高维护费用
  3. 对架构昂贵的修改
  4. 完全符合ACID
  5. String Blob

    1. 严格存储,自动阅读/搜索/修改费用昂贵
    2. 简单表架构
    3. 强制执行的数据没有结构
    4. 查找数据的速度很慢
    5. 严格限制ACID属性
    6. XML

      1. 可以强制执行架构的灵活存储
      2. 查找数据的速度很慢,可以通过索引进行改进
      3. 值可以直接查询
      4. 受限制的ACID属性
      5. 高存储开销
      6. 现在这还不是一个完整的清单。提到的一些要点也可能对一个项目有利,但对另一个项目则不利。在你减轻了所有的好处和坏处之后,应该更容易找出适合你的方式。

答案 1 :(得分:1)

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

例如:

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

  • 较少的字段=查询生成器(或SP)后面的代码较少的参数。

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

  • 包含许多字段的SQL表适用于存储和存储。搜索。 XML适用于传输和传输。格式化(往/来自应用程序)。

记住:

  

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

答案 2 :(得分:1)

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

因此将它存储为单列是完全合法的。

但是,你在评论中说:

  

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

“大部分”与“全部”不同。如果数据库必须对列的内容进行一些操作,那么你就会遇到问题,你应该把它作为单独的列存储 - 如果必须的话,将键/值对存储起来 - 或者作为XML。

答案 3 :(得分:0)

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

例如,想一下带有cd / mp3集合的人员列表。假设您将CD标题作为列表存储在一列中。在填写了100个条目的列表后,您注意到一个拼写错误并修复了一个人的标题。由于时间不够,你没有解决其他问题(不一致)。

过了一段时间,你会注意到你的数据库需要相当多的内存(例如)。 查看您的条目,您会发现有几个人拥有相同的CD。很明显,您可以多次存储相同的cd tilte(冗余)。