2017-08-09 42 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。换句话说,它取决于参考表中的特性,而不是参考表。

相关问题