最初にキーとインデックスを区別しましょう。キーは論理モデルの一部であり、多くの場合、一意のインデックスで実装されます。ただし、キーを作成せずに一意のインデックスを作成することはできますが、外部キーから参照することはできません。
候補キーは、テーブル内の行を一意に識別するものです。SQLでは、通常、候補キーの1つが主キーとして使用されます(ckの1つが他よりも「優れている」と考えられている理由は本当にわかりませんが、それはもう1つです。ストーリー)、残りの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を実装していますが、モデルの周囲にキーが分散されている場合は、更新に手間がかかります。
あなたの場合、おそらく私は主キーとして別の候補キーを選択し、電子メールがNOT NULLで一意であることを宣言します。