Yok hayır.
En azından yabancı anahtarlar için tek alanlı anahtarların bileşik anahtarlardan daha düşük olduğu durumlarda kesinlikle durumlar olduğunu söyleyebilirim . Bu, eğer tercih ederseniz, aynı zamanda tek alanlı bir vekil anahtarına sahip olmamanız gerektiği anlamına gelir, ancak kişisel olarak, birincil anahtar olarak adlandırılacak yabancı anahtarın hedefi olarak en sık kullanılan anahtarı kişisel olarak tercih ederim.
Amacımı aşağıdaki örneklerde göstermeye çalışacağım, ki burada:
brand araba markasıdır, örneğin Ford, Toyota vb.
dealer bir markaya bağlı fiziki bir bayiliktir (örneğin, yalnızca Fords satan bir Ford bayii)
model araba tipidir; örneğin, Ford Focus, Ford Fiesta vb.
stock Bayilik için geçerli ön ödemeli araç sayısı
Aşağıdaki gibi dealerve için tek alanlı bir vekil anahtar oluşturursak 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) )
o zaman stockbir Ford'u dealerbir "Toyota" modeline bağlayan bir sıra eklemek mümkündür . Ekleme brand_id references brandiçin stocktek sorun daha da kötüleştirir. Öte yandan, yabancı anahtarı birincil anahtarın bir parçası olarak tutarsak:
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 )
Şimdi "Ford" bayilerinin yalnızca "Ford" otomobillerini stoklayabilmesi kuralı, model tarafından doğal olarak uygulanmaktadır.
'Bileşik tuşlar' örneğinde, dealer_idtercihe göre benzersiz olabilir veya olmayabilir. Benzersiz olması gerekmez (yani alternatif bir anahtar), ancak bunu (çok az bir depolama alanı) yaparak çok az şey kaybedilir ve çok kullanışlı olabilir;
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )