Database-Design

對外鍵欄位使用空值的替代解決方案是什麼?

  • December 28, 2019

我的數據庫中有幾個表,其中包含連結到另一個表的外鍵欄位。問題是,該欄位的值並不總是存在,因此有時我可能不得不插入一個空外鍵欄位。詳細說明:

我有一張表Sense_LanguageSource,其中列出了字典中條目的各個詞源。這具有以下欄位:

  • LanguageSourceID(PK - 自動編號)
  • SenseFK(FK - 編號)
  • 語言程式碼(FK - 數字)
  • SourceWord(短文本)
  • LanguageSourceType(短文本)
  • IsWaseieigo(是/否)

LanguageCode領域是有問題的情況。它用於列出詞源源自的語言,在這種情況下,它是連結到LanguageCodeValue表的外鍵,其中包含 ISO-639-2B 程式碼和語言的全名。

但是,我要插入數據庫的一些詞源沒有語言程式碼,所以我必須在該欄位中插入一個 0。最初,Access 不允許我這樣做,所以我禁用了參照完整性。然後當我重新打開數據庫時,Access 說數據庫被入侵,需要修復。所以我認為我需要一個替代解決方案。

我會使其不那麼標準化,並在其中簡單地​​有一個 LanguageCode 的文本欄位,但是有兩個表引用該LanguageCodeValue表,並且有一個表來描述每個 LanguageCode 所指的內容似乎很有意義。我現在能想到的解決方案是:

  1. LanguageCode刪除欄位和表之間的關係LanguageCodeValue(使其純粹是參考表,而不是連結),SELECT如果我需要查找 LanguageCode 的含義,只需使用查詢。
  2. 在沒有參照完整性的情況下保持表之間的連結以允許空外鍵,並希望數據庫不會崩潰。
  3. 在要引用的表中插入一個“null”值LanguageCodeValue(我的意思是鍵值為 0 或類似值的實際記錄,文本欄位為空白值),以便輸入空外鍵,而不是輸入空外鍵,我可以連結到一個沒有任何意義的記錄。
  4. 另一個解決方案?

由於我是數據庫新手並且不確定最佳設計實踐,我想知道哪種解決方案最適合我的情況。

正如 Akina 在評論中所說,盡量避免破壞數據庫中的關係和參照完整性。如果有文件證明需要在其中有一個值來指示“無”、“未知”、“其他”或類似的東西,最好將它放在查找表中,而不是嘗試將 Access 分開以允許 NULL在外鍵欄位中。

保持引用完整性。選項#3 是您最好的選擇。但是,不要在 LanguageCodeValue 中插入空值,而是創建一個鍵為 -1 且值為“未知”的新記錄。任何使用空 LanguageCode 外鍵插入 Sense_LanguageSource 的記錄都應使用 -1 作為鍵。因此,任何連接都會將 LanguageCode 值顯示為“未知”。

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