使用 NULL 值或用有效值表示 NULL
Posted
技术标签:
【中文标题】使用 NULL 值或用有效值表示 NULL【英文标题】:use NULL value or represent NULL with valid value 【发布时间】:2013-08-03 10:31:28 【问题描述】:在我的数据库中,我目前有浮动数据。所有列都设置为 NULLABLE,当缺少值时,我放在那里NULL
。
我的数据库太大,如果我知道,值在 0 - 100 范围内,它们可以四舍五入到小数点后 1 位。所以使用浮点数是开销,我正在考虑使用 smallint (将每个浮点数乘以 10 并将其存储为舍入数字)。现在,NULL
值呢?
我有两个选择:
还是用NULL
使用一些“超出范围”的值,例如 9999,来表示 NULL
(并且在没有为列设置任何内容时,也将此值设为默认值)。但是,在我的查询中,我需要这样做:
SELECT AVG(NULLIF(data, 9999)) AS data, ....
(当我使用NULL
时,我可以只使用AVG(data)
,而NULL
的值不会被计算..)
什么更好用。还是有更好的技术?
【问题讨论】:
“我的数据库太大”是什么意思。查询减速?磁盘空间要求? @DanielSchneller 磁盘空间要求。随着数据类型的改变,我可以节省一半的空间,也可以做更好的搜索(我可以比较 int,但不能比较 float) 【参考方案1】:当您使用NULL
时,意味着您将此列设置为“无”,在第二种情况下,您为您的列指定一个代表NULL
的值。
所以首先你没有设置你的列,然后你设置了一个值,显示它是NULL
。这取决于你想做什么。如果您想在该列的数据库中做出承诺,请使用第二个,否则如果您只想为空,除非您填写它,否则请使用 NULL
。
【讨论】:
【参考方案2】:如果NULL
功能已经存在,您为什么还要尝试“推出自己的”功能?正如您所描述的,您对NULL
s 的使用是正确且完全有效的。我看不出使用幻数作为人为的 NULL 替代品可以获得任何优势;你只是介绍了错误的可能性。
TL;DR:
使用NULL
。
【讨论】:
【参考方案3】:如果您可以选择实际使用NULL
本身,为什么还要使用有效数据来表示NULL
?
我没有看到任何好处
【讨论】:
我想,也许是数据类型一致性。我在 C++ 中使用相同的方法(使用 9999),因为没有办法将 NULL 放入原始数据类型。 谢谢...我知道可以做到,但我不确定经典数据类型的性能。我会试一试,我会看到:)【参考方案4】:NULL
值与固定字段(float、int...)上的值占用完全相同的空间。您不能通过不使用 NULL 或其他方式来优化空间使用。对不起:)
【讨论】:
我通过将 float 更改为 smallint 来优化空间。关于 NULL 的问题只是出于性能原因和表的设计(什么更好用) 在这种情况下,仍然使用 NULL。这比对您的数据结构制定隐含规则要好。它还避免在您的查询中使用IFNULL()
...以上是关于使用 NULL 值或用有效值表示 NULL的主要内容,如果未能解决你的问题,请参考以下文章