Database-Design

添加一個布爾列;跟踪未觸及與錯誤

  • July 5, 2017

$$ backstory $$我有一個關於我們目前 Widget 庫存的簡單數據庫。它在五六個表中平均只有十幾列,但已經有大量記錄。 有些小元件帶有上限,有些沒有,但實際上我們以前從未跟踪過。現在管理層希望使用者能夠跟踪每個單獨的小元件是否帶有上限。我們不會進行盤點來檢查我們目前的庫存,但是當我為“Arrived Capped”添加新列時,將沒有關於今天之前收到的所有數據的數據。對於這種情況,通常的最佳實踐方法是什麼?

添加字元串列時,“”的含義很明顯;沒有輸入任何數據。但是我添加了一個布爾值,因此現有記錄將預設為一個確實表明某事的值:FALSE。

我的第一個想法是讓使用者門戶擁有,而不是複選框,這個問題的單選按鈕對。在創建新記錄時,或者甚至返回帶有 false-false 的舊記錄時,如果他們點擊 Yes 或 No,則記錄該值,加上另一個 bool 表示該問題實際上是手動回答的。那是; 如果第一個 bool 是 F,但第二個 bool 是 T,那麼第一個 bool 不是“預設 false”。

他們揮手的解決方案是將今天之前的記錄顯示為“未知”(這是因為現有記錄無法手動賦予使用者驗證的 false 值而被取消)。我應該使用 faux-bool int 並以三進制來考慮它嗎?或者,回到使用單獨的跟踪位/布爾值,我應該為這種數據創建一個新表嗎?這是一個普遍的概念嗎?有什麼命名約定嗎?

在大多數 DBMS 中,或者至少在我處理過的那些 DBMS 中,Bool 確實是三元組。您有 1、0 和 NULL。NULL 專門用於“我還沒有輸入任何數據”。根據您的編碼方式,您的複選框應預設為未選中 0 或 NULL。然後 1 用於檢查當然。但是,在您的報告中,您實際上可以區分有人查看並輸入值(1 或 0)的行和尚未更新的行(值為 NULL 的行)。

當 Codd 將 null 標記形式化時,他寫道,這是一種處理 MISSING 和 INAPPLICABLE 數據的方法。你在這裡有一個明顯的失踪案例。

正如 Kenneth 正確指出的那樣,它實際上並不是一個三謂詞系統,而是一個雙謂詞系統,您可能實際上並不知道值。null 本身不是一個值 - 它是實際值不可用的標記。

但是,您的使用者界面需要顯示 3 種狀態是、否和不知道。

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