早在 2020 年,我們就了解了關聯式資料庫系統中的 NULL 值及其用途。正如那篇文章所述,NULL 值已成為一個特殊標記,表示不存在任何數值。你也可以說 NULL 值可能表示欄可能有一個值,但是你還不知道是什麼。在這種情況下,它們充當預留位置,直到你最終收集到所需資料,用實際值填充資料表欄位。
此外,當你考慮到所有主要資料庫供應商都支援 NULL 作為預設值時,只有使用它們才有意義,不是嗎?好吧,沒那麼快。除非絕對必要,否則有些資料庫設計人員會避免使用 NULL。他們是不是知道一些其他人不知道的事?請繼續閱讀,找出答案!
空間考慮因素
儘管 NULL 值表示「無」或「無值」,但資料庫將它們視為一個值。就此而言,它們會佔用硬碟的空間。因此,如果你認為使用 NULL 值可以節省硬碟空間,那麼你可能錯了。實際上,NULL 被認為是一個可變長度的值,這意味著它可以是兩三個位元組或幾個位元組,具體取決於欄類型。資料庫會為額外的位元組留出空間,會大於欄位中儲存的值,結果是資料庫可能會比使用常規值佔用更多的硬碟空間。
不建立缺少資訊的記錄
一些資料庫管理員認為,如果無法填充記錄的所有欄,則不應建立記錄。這個論點顯然不適用於所有用例,但它的意思是只有當所有欄位都有實際值而沒有任何預留位置時才應該建立記錄。例如,在銀行應用程式中,如果你不知道交易金額,你不會繼續進行交易。這很有道理,但這種嚴格的標準在其他行業(例如電子商務或收集使用者數據的網站)中不是很有效。
複雜的 SQL
另一個缺點會影響資料庫預存程序。雖然大多數資料庫都提供了偵測 NULL 值的函式,但仍必須特別注意區分 NULL 和其他值。這意味著你的 SQL 程序可能比所需的要長得多,而且它們也可能變得難以閱讀。如果程序過於復雜或難以理解,資料庫管理員可能會拒絕程式碼變更。
例如,以下是 Navicat Premium 16 中的一個小型資料表,它有數值、空字串和 NULL:
在 Navicat 中,使用「編輯」功能表就能很容易插入空字串或 NULL。
以下是一個根據各種條件計算 name 數量的查詢:
我們想看到 5 的計數,因為記錄 4、5、7、8 和 10 中沒有值。然而,只有 combo_count 傳回了 5。這是因為雖然 NULL 值沒有長度,但 length() 函式揀選 NULL。
從這個例子中,我們可以得出一個結論,允許 NULL 值可能會令你更難取得你在尋找的資料。此外,允許 NULL 值可能會降低你對資料庫中資料的信心,因為你永遠無法確定某個值是否存在。
總結
大多數資料庫從業者選擇在他們的資料庫資料表中允許一些 NULL 值,因為它們幾乎是所有資料庫的預設值,並且可以作為缺失資料的預留位置。但另一方面,有一些 DBA 認為允許 NULL 是得不償失的。而這篇文章的重點是,在設計資料庫之前,你應該考慮自己的業務流程,並選擇最適合你的資料的結構。