据我所知,除非指定,否则外键列可以为NULL并重复(至少在Oracle SQL中)。是否更好的做法是将外键列声明为非空且唯一或保留原样?这是根据当前情况做出的决定,还是应该遵循一般规则?
答案 0 :(得分:3)
所有数据库都允许外键为NULL和非UNIQUE。您如何选择声明特定外键取决于业务案例。
考虑向秘密特工销售耗材的公司使用的以下表格。
CountryList (
CountryCode NOT NULL PRIMARY KEY,
CountryName NOT NULL
)
SecretAgents (
CodeName NOT NULL PRIMARY KEY,
HomeCountryCode FOREIGN KEY REFERENCES CountryList(CountryCode)
)
显然,HomeCountryCode不会是唯一的,因为你可能会在每个国家/地区向多个间谍出售。它是否可以为空?这取决于您的商业模式是否要求每个客户声明其所在国家/地区。如果该模型允许您与没有母国的人做生意,或者不希望向您透露本国,则该字段应为NULL。但是,如果您的业务模型中没有考虑无状态的actor,则应该将该列声明为NOT NULL,以便无法创建无效的客户记录。
现在,考虑附加表
SpyMasters (
CountryCode NOT NULL PRIMARY KEY References CountryList(CountryCode),
Name NOT NULL PRIMARY KEY
)
此表列出了具有间谍主人的国家/地区的(单身)间谍。并非所有国家/地区都会出现在此列表中,但每个国家/地区只能出现一次。在这种情况下,CountryCode字段是UNIQUE - 但您不必显式声明,因为PRIMARY KEY始终包含唯一性。
答案 1 :(得分:2)
外键是另一个表中的属性。在原始表("引用表")中,外键应该是唯一的而非NULL
。事实上,它几乎应该始终是该表的主键。
在引用表中,如果始终需要值,则只应声明引用列 - NULL
。如果您不想要重复,则只应声明unique
。换句话说,它取决于引用表中的特征,而不是引用的表。