いや
少なくとも外部キーの目的上、単一フィールドキーが複合キーよりも劣る場合は確かにあると思います。それはあなたが望むなら単一フィールドの代理キーも持つべきではないということではありませんが、私は個人的には主キーと呼ばれる外部キーのターゲットとして最も頻繁に使用されるキーを好みます
次の例で私のポイントを説明しようとします。
brand
フォード、トヨタなどの自動車ブランド
dealer
ブランドに関連付けられた物理的なディーラーです(例:フォードのみを販売するフォードディーラー)
model
フォードフォーカス、フォードフィエスタなどの車のタイプ
stock
各ディーラーの現在のフォアコートの車の数です
我々は、単一のフィールドサロゲートキーを作成した場合のためにdealer
とmodel
、以下のように:
create table brand( brand_id integer primary key );
create table dealer( dealer_id integer primary key,
brand_id integer references brand )
create table model( model_id integer primary key,
brand_id integer references brand )
create table stock( model_id integer references model,
dealer_id integer references dealer,
quantity integer,
primary key(model_id, dealer_id) )
次にstock
、Ford dealer
を「Toyota」モデルにリンクする行を挿入することができます。追加brand_id references brand
しますstock
だけで問題が悪化します。一方、外部キーを次のようにプライマリキーの一部として保持する場合:
create table brand( brand_id integer primary key );
create table dealer( brand_id integer references brand,
dealer_id integer,
primary key(brand_id, dealer_id) )
create table model( brand_id integer references brand,
model_id integer,
primary key(brand_id, model_id) )
create table stock( brand_id integer,
model_id integer,
dealer_id integer,
quantity integer,
primary key(brand_id, model_id, dealer_id),
foreign key(brand_id, model_id) references model,
foreign key(brand_id, dealer_id) references dealer )
現在、「Ford」ディーラーは「Ford」車のみを在庫できるというルールがモデルによって自然に施行されています。
「複合キー」の例でdealer_id
は、好みに応じて一意である場合と一意でない場合があることに注意してください。一意である必要はありません(つまり、代替キー)が、そうすることによって失われることはほとんどなく(おそらく少しのストレージスペース)、非常に便利になる可能性があるので、通常は次のように設定します。
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )