外键列应该是唯一的而不是空的吗?

Should Foreign Key Columns be Unique and Not Null?

我知道,除非指定,否则外键列可以为 NULL 和重复(至少在 Oracle SQL 中)。将外键列声明为不为空且唯一或保持原样是更好的做法吗?这是应该根据手头的情况做出的决定,还是应该遵循的一般规则?

外键是另一个 table 中的一个属性。在原来的table("referenced table")中,外键应该是唯一的,非NULL。事实上,它应该几乎总是那个table的主键。

在引用 table 中,如果始终需要值,则只应将引用列声明为 not-NULL。如果您不想重复,则只应将其声明为 unique。换句话说,它取决于 referencing table 中的特征,而不是 referenced table.

所有数据库都允许外键为 NULLable 和非 UNIQUE。您选择如何声明特定外键取决于业务案例。

考虑以下 table 一家公司使用的向秘密特工出售物资的公司。

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

显然,HomeCountryCode 不会是唯一的,因为您可能会在每个国家/地区出售给不止一名间谍。它可以为空吗?这取决于您的商业模式是否 要求 每个客户都声明他们的祖国。如果模型允许您与没有祖国的人做生意,或者不想向您透露祖国,那么该字段应该是 NULLable。但是,如果您的业务模型中没有考虑到无状态参与者,您应该声明该列为 NOT NULL,这样就无法创建无效的客户记录。

现在,考虑额外的 table

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

这个table列出了那些拥有间谍大师的国家的(单身)间谍头目。并非所有国家都会出现在此列表中,但每个国家只能出现一次。在这种情况下,CountryCode 字段是 UNIQUE——但您不必明确声明它,因为 PRIMARY KEY 始终包含唯一性。