Database-Design

使用 NULL 值表示該值無關緊要。並不是不知道

  • February 3, 2021

假設我有一張帶有電腦的表,其中一列是布爾“風扇”。如果為 true,則電腦有風扇,如果為 false,則沒有。它永遠不能為空。

現在我有另一個表格,其中列出了改進電腦的建議。

我想要一些建議適用於所有有風扇的電腦。為此,我有一列“風扇”,當它為真時,它僅適用於帶有風扇的電腦。當 false 僅適用於沒有風扇的電腦。

當建議不關心電腦是否有風扇時,將列設置為 null 是否是好的數據庫設計?如建議中所述,無論電腦是否有風扇,都應適用。

空值的目的是該列是未知的。這不是這裡的情況。不是我不知道推薦的是帶風扇還是不帶風扇的電腦,而是我特別不在乎。這讓我覺得這不是一個好主意,只是改變了 null 的含義。

另一方面,我認為如果沒有定義推薦的“粉絲”過濾器,這意味著它不需要基於此過濾是有道理的。

定義推薦的另一種方法是有一個applies_to_fanned_computersapplies_to_not_fanned_computers列。如果兩者都為真,則適用於其中之一,如果只有一個為真,則適用於其中之一。

哪個選項最好?我對第一個選項是對數據庫中空值的目的的混蛋是對的嗎?

為此目的使用 NULL 會使值過載,並要求使用者知道 NULL 的這種特殊含義。這些是“魔法”值,應該避免。

您需要的不僅僅是兩個值。如果您擔心空間,請使用 SMALLINT。

您應該具有以下值(至少):

  • NULL - 未知/未指定
  • 是 - 需要風扇
  • NO - 不需要風扇
  • 不適用 - 不適用

您可以使用列舉表來儲存映射,或者只使用 CHAR(3) 欄位開始。

我的方法是考慮欄位是什麼,即在電腦上儲存資訊。永遠不會有風扇會導致 NULL,只是一個是或否。在您將其用作電腦的主要類別的情況下,我會避免這種情況,而是使用您的查詢和儲存過程來考慮過濾器。在儲存過程中,您可以讓 WHERE 子句查找不同的組合;

僅帶風扇的電腦 - 選擇

$$ recommendations $$從表 WHERE$$ has_fan $$=1 只有沒有風扇的電腦–SELECT

$$ recommendations $$從表 WHERE$$ has_fan $$=0 所有電腦\不關心 – 不要使用 WHERE 子句;SELECT

$$ recommendations $$從表

引用自:https://dba.stackexchange.com/questions/284594