Database-Design

有一個部分時間為空的列,或者一個帶有外鍵的單獨表是更好的做法嗎?

  • October 12, 2021

假設您有一個表,subject,它代表一個測試對象(一種化學物質)。測試將提供結果、通過、失敗或不確定。它將花費大約 75% 的時間不為空,但在設置測試時它將為空。一個主題永遠不能被測試超過一次。

將這個結果列放在主題表中是更好的做法,還是在第二個表中插入結果(使用相關主題的外鍵)一旦確定?

我製作了這些小圖,希望能更好地說明我的要求。’etc’ 用於代表與問題無關的數據的多個其他列:

Subject 表的圖表,包含值 ID、participant_id、subject_type、test_status、created_at 等和結果列

相對

Subject 表的圖表,包含值 ID、participant_id、subject_type、test_status、created_at 等列。 第二個表 subject_results 包含主題鍵(主題表的外鍵)和結果列。

這實際上更多地取決於您的案例。您的第二個設計可能更加規範化。subject是否有過多次測試相同的情況?如果是這樣,那麼由於它的標準化,第二種情況肯定會更合適。而您的第一個案例會不必要地重複數據,這可能導致容易出錯的數據(除了重複)。

除此之外,在適當的時候使欄位可以為空並沒有錯,並且有一個案例。

您還沒有準確地定義“更好的實踐”對您意味著什麼,並且無論如何這使得該問題不適合該網站(答案將基於意見而不是事實)。

以下是一些相關事實:

如果您打算描述一個關係設計,那麼選項 1. 甚至不是一個選項,因為關係模型沒有這個叫做“null”的東西。

您在選項 2 中的模型忽略了實際上必不可少的一件事,即 _results 方面的基數是“0-1”,而不僅僅是您所寫的“1”。忽略最小基數為 0 的事實會對任何讀者隱藏基本資訊。

也就是說,假設 (1) 一個像 SQL 這樣的 DML,它確實有一個叫做“null”的東西,以及 (2) 所有需要的數據庫約束也已經到位,這兩種設計是完全資訊等效的。如果存在將一個模式的每個有效數據庫值轉換為另一個模式的數據庫值,反之亦然的關係代數表達式,則設計是資訊等價的(因此數據庫值之間存在雙射兩種設計)。由於那個空的東西,在 SQL 上沒有真正的關係,因此減少了一些鬆弛,這些表達式是(前置 A_ 和 B_ 以區分設計 1 的表和設計 2 的表):

B_SUBJECT === SELECT ID, … , ETC FROM A_SUBJECT

B_SUBJECT_RESULT === SELECT ID, RESULT FROM A_SUBJECT WHERE RESULT IS NOT NULL

A_SUBJECT === B_SUBJECT 左外連接 B_SUBJECT_RESULT ON ID = SUBJECT_ID

也許沒有涵蓋所有細節,但它確實涵蓋了要點並且應該足以使這個想法變得清晰。相關性是,如果兩個設計是資訊等價的,那麼它們之間在語義層面上沒有區別。因此,任何差異都必須在物理領域(或者在編寫所有需要的 DML 表達式需要多少時間的領域,或者在您的 DBMS 使其在任一設計中進行數據庫維護變得多麼容易的領域),但是這種差異是否應該從您提供的那種模式中變得明顯,至少是非常值得商榷的。

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