2017-08-09 39 views
0

我明白,除非指定,否則外鍵列可以是NULL並且是重複的(至少在Oracle SQL中)。將外鍵列聲明爲非空且唯一或保留原樣是否更好?這是根據當時的情況作出的決定,還是應該遵循的一般規則?外鍵列應該是唯一的而不是空的?

+0

這與Oracle SQL無關,與數據建模有關。在列可以爲空或不爲空的情況下,您可以有參照約束,並且它們通常是非唯一的,除非在1:1關係的情況下,在這種情況下,您會對其設置唯一約束。 –

回答

2

所有數據庫都允許外鍵爲NULLable和非UNIQUE。您如何選擇聲明特定的外鍵取決於業務案例。

請考慮以下供銷售特勤人員的公司使用的表格。

CountryList (
    CountryCode NOT NULL PRIMARY KEY, 
    CountryName NOT NULL 
) 
SecretAgents (
    CodeName NOT NULL PRIMARY KEY, 
    HomeCountryCode FOREIGN KEY REFERENCES CountryList(CountryCode) 
) 

顯然,HomeCountryCode不會是唯一的,因爲您可能在每個國家銷售多個間諜。它可以爲空嗎?這取決於您的商業模式是否需要每個客戶申報其本國或不。如果該模型允許您與沒有本國的人開展業務,或者不希望向您透露本國,那麼該字段應該是無效的。但是,如果在您的業務模型中不考慮無州的演員,則應聲明NOT NULL列,以便無法創建無效的客戶記錄。

現在,考慮附加表

SpyMasters (
    CountryCode NOT NULL PRIMARY KEY References CountryList(CountryCode), 
    Name NOT NULL PRIMARY KEY 
) 

下表列出間諜有間諜大師這些國家的(單)頭。並非所有國家都會出現在此列表中,但每個國家/地區只能出現一次。在這種情況下,CountryCode字段是UNIQUE - 但您不必明確聲明,因爲PRIMARY KEY總是包含唯一性。

1

該外鍵是另一個表中的屬性。在原始表格(「參考表格」)中,外鍵應該是唯一的並且不是NULL。事實上,它幾乎總是這張桌子的主要關鍵。

在引用表中,如果始終需要值,則只應聲明引用列不是 - NULL。如果您不想重複,只應聲明unique。換句話說,它取決於參考表中的特性,而不是參考表。

相關問題