【问题标题】:SQL: Datatype choice for values -1, 0 and 1SQL:值 -1、0 和 1 的数据类型选择
【发布时间】:2010-12-26 16:17:24
【问题描述】:

考虑一个表,它的工作是存储对象的评级。这里感兴趣的列是名为 RATING 的列。要存储的值的有效范围是:

  • 1
  • 0
  • -1

首先想到的是存储为 tinyint smallint。这将只存储一个字节每行两个字节。鉴于 tinyint 的范围是 0 到 255 smallint 的范围是 -32768 到 32767,它是否适合这里?还有其他更合适的数据类型吗?对于表和数据库的预期大小,占用的空间微不足道。用户界面将负责确保通过枚举选择这三个值。

问题:您能否建议一个更小的存储空间或任何巧妙的设置来存储这三个值之一而不牺牲任何易于理解?

其他注意事项:

  • 存储空间不是一个非常大的问题
  • 此值将相加得到总评分
  • 这可能是微优化的情况
  • SQL Server 2008

【问题讨论】:

    标签: sql sql-server tsql types


    【解决方案1】:

    我想说,如果可能的话,您应该使用 bit 或 tinyint。从sqlshack查看此表:

    【讨论】:

      【解决方案2】:

      如果空间真的是个问题,那么两个位:

      , Sign bit not null
      , StorageVALUE bit not null
      , VALUE AS CASE WHEN Sign = 0 THEN -StorageValue ELSE StorageValue END
      

      【讨论】:

      • 如果你要走这条路,为什么不使用一个可以为空的位,用 null 表示 -1?
      【解决方案3】:

      求和时,最好将数据以可用的格式保存在一列中

      SELECT SUM(Rating) FROM MYTable ...
      

      因此,根据其他答案,smallint 是您需要的。否则,任何人为的解决方案只会使其更难使用和验证。

      当然,您应该定义 CHECK CONSTRAINT 以确保您只允许 -1、0 和 1

      【讨论】:

      • 我只是要指出需要检查约束。
      【解决方案4】:

      您能否建议一个更小的存储大小或任何巧妙的设置来存储这三个值之一而不牺牲任何易于理解?

      正如您所提到的,当您可以花 100 美元购买 TB 驱动器时,找到最小的数据类型是没有意义的。

      1. 一个名为 RATING_CODE 的附加表,包含两列:

        • RATING_CODE,PK
        • DESCRIPTION
      2. 将当前表的rating 列更改为rating_code,并设置与RATING_CODE 表的外键关系。

      现在更容易理解每​​个评分值的含义,因为它附带了说明。这是未来的证明,以防您想添加高达 5 或 10 的评级。

      【讨论】:

        【解决方案5】:

        smallint 是可以准确跟踪 -1、0 和 1 的 (ahem) 最小整数数据类型。如果空间不是问题,并且您说过不是问题,那么使用小号。其他任何事情都会过于聪明,并且需要比必要更多的实施工作。

        【讨论】:

        • 同意。考虑这些事情很好,但除非您的表有数十亿行,否则在 smallint 之外进行优化是不必要的,并且可能有害。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-28
        • 1970-01-01
        • 1970-01-01
        • 2018-04-30
        • 2017-11-28
        • 2011-06-12
        • 1970-01-01
        相关资源
        最近更新 更多