考虑一个表,其作用是存储对象的评级。这里感兴趣的列是名为 RATING 的列。要存储的有效值范围是:
第一个想法是存储为 tinyint smallint
。这将存储每行只有一个字节两个字节。鉴于 tinyint的范围为0到255 smallint的范围为-32768到32767,这适合吗?还有其他数据类型更合适吗?所占用的空间对于桌子的预期尺寸来说是微不足道的。数据库。用户界面将负责确保通过枚举选择这三个值。
问题:您是否可以建议较小的存储空间或任何聪明的设置来存储这三个值中的一个,而不会牺牲任何易于理解的内容?
其他考虑因素:
答案 0 :(得分:5)
smallint 是(ahem)最小的整数数据类型,可以准确地跟踪-1,0和1.如果空间不是问题,并且你说它不是,那么使用SMALLINT。其他任何事情都会过于聪明,需要的实施工作远远超过必要的范围。
答案 1 :(得分:3)
你可以建议一个较小的存储空间或任何聪明的设置来存储这三个值中的一个,而不会牺牲任何易于理解的东西吗?
正如您所提到的,当您以100美元购买太字节驱动器时,找到最小的数据类型是没有意义的。
另一个名为RATING_CODE
的表,有两列:
RATING_CODE
,pk DESCRIPTION
将当前表的rating
列更改为rating_code
,并设置与RATING_CODE
表的外键关系。
现在,您可以更轻松地了解每个评级值的含义,因为有一个与之相关的描述。这是未来的证据,如果你想增加收视率,比如最多5或10。
答案 2 :(得分:3)
总结时,最好将数据保存在一个可用格式的列中
SELECT SUM(Rating) FROM MYTable ...
因此,根据其他答案,smallint是您需要的。否则,任何人为的解决方案都会使其更难以使用和验证。
当然,您应该定义一个CHECK CONSTRAINT以确保您只允许-1,0和1
答案 3 :(得分:3)
如果空间确实是个问题,那么两位:
, Sign bit not null
, StorageVALUE bit not null
, VALUE AS CASE WHEN Sign = 0 THEN -StorageValue ELSE StorageValue END
答案 4 :(得分:0)
我想说,如果可能,您应该使用 bit 或 tinyint。查看来自 sqlshack 的这张表: