2015-12-21 99 views
3

我有型BOOLEANFALSE和TRUE VS NULL和TRUE

列在第一(上INSERT),值将始终FALSE后,才可以更新列TRUE

所以问题是:使此列NOT NULL DEFAULT FALSE,或使该列DEFAULT NULL,然后更新为TRUE(如果随后也将被扭转更新,集列NULL,而不是FALSE价值,所以在这种情况下,决不会被用于FALSE值)

哪个选择会更好的观点性能和存储节省?

+0

在回答存储问题,你可能会发现价值在这里:http://stackoverflow.com/questions/4229805/how-much-disk-space-is-needed-to-store-a-null-value-using -postgresql-db和http://www.postgresql.org/docs/9.1/static/datatype-boolean.html – DanK

回答

4

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

对于性能(以及程序员的生产力/维护),这取决于你打算如何使用它。这里没有足够的信息,也不可能在没有邀请任何实际将这个问题读到您的所有项目会议上的任何人的情况下获得足够的信息。

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

作为一个例子,我在高等教育学院工作。这项业务发生的一件事是向学生发送经济援助奖励函。学生然后签署并返回信件。可接受的奖项可能稍后会被拒绝或超越,但这不会改变学生已签署此信并接受此奖项的事实。法规要求我们保留这些信件,但从数据库的角度来看,仅仅知道信件中的奖励是否被接受这个布尔问题已经足够了。很快显而易见,当奖项被接受时,我们也需要知道。因此,该字段使用日期时间列。

+0

谢谢,也根据这里的其他答案,我选择使用NOT NULL DEFAULT FALSE,这真的会更清楚。关于保存日期,我还保存每个更新日期,但保存与另一个表,因为需要报告所有事件(状态更改)按日期。 – RIKI

3

如果你想除非特别设置为TRUE承担FALSE,然后使用NOT NULL DEFAULT FALSE。这也取决于你如何使用这一列。如果你只测试column = TRUE,那么不要认为这很重要。重点是NULL不等于FALSE。

3

与假装NULL麻烦的是假是NULL既不是FALSE,也不TRUE。

如果你在一个表some_tablenull_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是假的,但如果你只存储NULL,而不是FALSE这些列中,它将返回0。要算上其他15行,你必须写一个变体:

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

这反直觉的行为意味着你会得到人们错误的答案谁可以原谅通过存储在数据混淆你的表。

因此,你应该去:

NOT NULL DEFAULT FALSE 

另一条道路通向疯狂,迟早的事。

相关问题