最佳实践:我应该将价格和成本存储为 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?的主要内容,如果未能解决你的问题,请参考以下文章

加盐密码:最佳实践? [关闭]

核心数据模型对象保存的最佳实践

向客户端发送数据的最佳实践是啥:POCO 还是 DTO?

雪花数据加载最佳实践规范化还是非规范化?

使用 CDK、AWS 和 Github 私有存储库部署的最佳实践?

连接/断开数据库的最佳实践是啥?