3

我有类型的列BOOLEAN

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

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

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

4

3 回答 3

4

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

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

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

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

于 2015-12-21T17:09:52.860 回答
3

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

于 2015-12-21T17:10:09.320 回答
3

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

如果null_or_true表中有列some_table,则可以编写三个 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。第二个获取 innull_or_true值为 TRUE 的行数;这可能返回 15。第三个查询返回null_or_trueFALSE 的行数,但如果您在这些列中仅存储 NULL 而不是 FALSE,它将返回 0。要计算其他 15 行,您必须编写一个变体上:

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

这种违反直觉的行为意味着您会从那些被存储在表中的数据弄糊涂的人那里得到错误的答案。

因此,您应该使用:

NOT NULL DEFAULT FALSE

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

于 2015-12-21T17:22:16.023 回答