最佳实践:我应该将价格和成本存储为 NULL 还是 NOT NULL?
Posted
技术标签:
【中文标题】最佳实践:我应该将价格和成本存储为 NULL 还是 NOT NULL?【英文标题】:Best practice: should I store prices and costs as NULL or NOT NULL? 【发布时间】:2013-05-01 15:09:03 【问题描述】:我正在使用由许多人开发的数据库。与成本或价格相关的字段存在许多不一致之处;在某些表中,这些列是 NULL,而在其他表中,它们不是 NULL。我正在考虑将表格和代码更新到某个标准。
我看到允许 NULL 的唯一优点是您的值未设置 (NULL) 或值设置为空白 (0.00) 之间的差异。如果该列不为 NULL,则所有记录的默认值为 0.00,您将无法分辨用户将哪些记录设置为 0.00。另一方面,用户在系统中将成本或价格设置为 0.00 是没有任何意义的。
在您看来,这方面的最佳做法是什么?
【问题讨论】:
这个之前已经讨论过好几次了,例如here 和 here。一个关键点是,当与MIN()
、MAX()
或 AVG()
等聚合函数一起使用时,使用零而不是 NULL 会给出不正确的(对大多数人而言)结果。
【参考方案1】:
NULL 表示“未知”恕我直言。如果“0.00”不是价格/成本,那么它应该为 NULL。有些东西是 0.00(例如,如果您购买 CD 后获得免费 T 恤)。请不要在您的表格中设置“ZeroMeansNotKnown”“标志”。那是松鼠的代码。
【讨论】:
您还可以添加一个 CHECK 约束来强制一个非零价格。您可以将其放入“现在”,但如果您发现需要放入“价格未知”行,请“稍后”删除约束。我发现这是一种更好的做法,因为它更容易删除约束(或调整约束),然后将列从“not null”更改为“null”,恕我直言。但这就是我。那里有一点灰色区域。【参考方案2】:这可能从管理的角度来看是可行的,但是那些从前端应用程序查询数据库的人呢?例如,如果用户想要过滤所有成本为“0”的项目的搜索,那么他们不会考虑 NULL(作为用户,他们很可能不会)。
从管理的角度来看,您可以通过同时查询 null 列和 value 列来设置查询以覆盖整个范围:
如果为空:
NULLIF(RTRIM(field), '') IS NOT NULL
如果为空:
NULLIF(RTRIM(field), NULL) IS NULL --or simply 'IS NULL'
默认值:
(COALESCE(field, '0.0')
【讨论】:
以上是关于最佳实践:我应该将价格和成本存储为 NULL 还是 NOT NULL?的主要内容,如果未能解决你的问题,请参考以下文章