【问题标题】:FALSE and TRUE vs NULL and TRUEFALSE 和 TRUE 与 NULL 和 TRUE
【发布时间】:2016-03-27 19:58:42
【问题描述】:

我有BOOLEAN类型的列

起初(在INSERT),值将始终为FALSE,只有在更新列为TRUE之后才能更新

所以问题是:将此列设为NOT NULL DEFAULT FALSE,或将此列设为DEFAULT NULL,然后更新为TRUE(如果那时也将反向更新,则设置列NULL而不是FALSE值,所以在这种情况下,永远不会使用FALSE value)

从性能和节省存储的角度来看,哪种选择会更好?

【问题讨论】:

标签: sql postgresql plpgsql postgresql-9.5


【解决方案1】:

它对存储没有任何意义。根据其他可为空的列,如果该列碰巧将可空位图溢出到下一个字节,我们最多只能讨论一个字节,但很可能它根本不会添加任何存储空间。

对于性能(以及程序员的生产力/维护),很大程度上取决于您打算如何使用它。这里没有足够的信息,如果不邀请实际阅读此问题的任何人参加您的所有项目会议,也无法获得足够的信息。

就个人而言,当我有一个默认为 false 的布尔列(无论您选择如何表示它),然后在某个时候变为 true 并且 保持 true,我喜欢使用可为空的 DateTime 列表示该值,其中任何日期都表示该值为真,NULL 表示假。我的经验是,您几乎总是最终想知道该值变为真的日期和时间。

作为一个例子,我在高等教育机构工作。在这项业务中发生的一件事是向学生发送经济援助奖励信。然后学生签名并返回信件。被接受的奖项可能会在以后被拒绝或取代,但这不会改变学生已经签署这封信并接受了这个奖项的事实。法规要求我们将这些信件存档,但从数据库的角度来看,只要知道信件中的奖项是否被接受的布尔问题就足够了。很快就很明显,我们还需要知道何时这些奖项是被接受的。因此,该字段使用日期时间列。

【讨论】:

  • 谢谢,也根据这里的其他答案,我选择使用NOT NULL DEFAULT FALSE,这样真的会更清楚。关于保存日期,由于需要按日期报告所有事件(状态更改),我还保存了每个更新日期,但使用另一个表格。
【解决方案2】:

如果您想假设为 FALSE,除非特别设置为 TRUE,请使用 NOT NULL DEFAULT FALSE。这还取决于您如何使用此列。如果您只测试 where column = TRUE,那么不要认为这很重要。关键是NULL不等于FALSE。

【讨论】:

    【解决方案3】:

    假装 NULL 是 FALSE 的问题在于 NULL 既不是 FALSE 也不是 TRUE。

    如果您在表 some_table 中有列 null_or_true,您可能会编写三个 SELECT 语句:

    SELECT COUNT(*) FROM some_table;
    SELECT COUNT(*) FROM some_table WHERE null_or_true;
    SELECT COUNT(*) FROM some_table WHERE NOT null_or_true;
    

    第一个获取总行数,例如 30。第二个获取 null_or_true 中的值为 TRUE 的行数;这可能返回 15。第三个查询返回 null_or_true 为 FALSE 的行数,但如果您只在这些列中存储 NULL 而不是 FALSE,它将返回 0。要计算其他 15 行,您必须写一个变体:

    SELECT COUNT(*) FROM some_table WHERE null_or_true IS NULL;
    

    这种违反直觉的行为意味着您会从人们那里得到错误的答案,这些人会因为存储在您的表中的数据而感到困惑,这是可以原谅的。

    因此,您应该选择:

    NOT NULL DEFAULT FALSE
    

    另一条路迟早会导致疯狂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-22
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2020-12-05
      • 1970-01-01
      • 2010-11-30
      相关资源
      最近更新 更多