關於數據庫null/not null/default的思考

=== 總原則 ===

1. 爲確保數據完整性和邏輯性,重要字段,配置字段,影響多個關係或者程序運行的字段(如:trans_id_sql_str(抓取程序要用它來查詢數據庫),應儘量not null

2. 在not null的狀況下,不該不加考慮地給default值,不然將形成數據誤導, 應只對重要性不高,或者邏輯上能夠給default值的給default值,如性別-未知,初始金額-0,初始計數-0,時間-now()等

3. 在table註釋或api文檔中,應明確提示字段狀況:sql

- not null (must supply anytime)
- not null (grauntee by default or trigger)
- allow null (be careful!)

4. 在sql程序或應用程序中,應嚴格按上面的api文檔,該判斷null的判斷null,不應判斷的不要亂判斷,以避免引發誤導。而且可以使程序的邏輯更爲清晰。 數據庫

5. 在是否null和是否給默認值的狀況下,不該因考慮批量導入不完整的初始數據或測試數據的方便性而作出妥協。 

=== allow null 的典型狀況 ===

1. 外鍵缺失
將缺失外鍵默認設爲0(對應一條id爲0的假數據)是個壞主意,會帶來比null更大的麻煩——關係誤導從而產生連環錯誤。故這種狀況仍是應顯式指明能夠爲null,明確表示關聯關係不存在。

2. 確實可能一會兒提供不了,而且也不會有重大或連鎖影響的。
如:用戶 UA,給默認值''是毫無心義的。 
相關文章
相關標籤/搜索