首先让我们区分键和索引,键是逻辑模型的一部分,通常使用唯一索引来实现。但是,您可以创建唯一索引而不创建键,但是不能由外键引用。
候选键可以唯一地标识表中的行,在SQL中,候选键中的一个通常用作主键(我从不真正理解为什么ck中的一个被认为比其他人“更好”,但是那是另一个故事),剩下的ck成为唯一约束。
可以使用与主键相同的方式来使用唯一约束。考虑:
create table A ( x ... not null
, y ... not null
, z ... not null
, unique (x)
, primary key (y,z) );
create table B ( x ...
, ...
, foreign key (x) references A (x) );
create table C ( y ...
, z ...
, ...
, foreign key (y, z) references A (y, z) );
B引用唯一约束,C引用主键约束。
NOT NULL是另一种约束。根据您的情况,您可以对电子邮件强制执行此操作,而无需声明其唯一性。
帖子的下一个方面涉及密钥的稳定性,密钥应该是稳定的(但这并不意味着它永远不能更改,它不必是不变的)。一些DBMS实现了ON UPDATE CASCADE,它可以为此类操作提供帮助,但是即使密钥在您的模型中分布,更新它也会很麻烦。
在您的情况下,我可能会选择另一个候选键作为主键,并声明email为NOT NULL和UNIQUE。