【问题标题】:Best practice: should I store prices and costs as NULL or NOT NULL?最佳实践:我应该将价格和成本存储为 NULL 还是 NOT NULL?
【发布时间】:2013-05-01 15:09:03
【问题描述】:

我正在使用由许多人开发的数据库。与成本或价格相关的字段存在许多不一致之处;在某些表中,这些列是 NULL,而在其他表中,它们不是 NULL。我正在考虑将表格和代码更新到某个标准。

我看到允许 NULL 的唯一优点是您的值未设置 (NULL) 或值设置为空白 (0.00) 之间的差异。如果该列不为 NULL,则所有记录的默认值为 0.00,您将无法分辨用户将哪些记录设置为 0.00。另一方面,用户在系统中将成本或价格设置为 0.00 是没有任何意义的。

在您看来,这方面的最佳做法是什么?

【问题讨论】:

  • 这个之前已经讨论过好几次了,例如herehere。一个关键点是,当与 MIN()MAX()AVG() 等聚合函数一起使用时,使用零而不是 NULL 会给出不正确的(对大多数人而言)结果。

标签: sql sql-server tsql 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') 

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2016-09-03
    • 2010-10-15
    相关资源
    最近更新 更多