2015-12-21 71 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 

另一條道路通向瘋狂,遲早的事。