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 dealer
ve 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 stock
bir Ford'u dealer
bir "Toyota" modeline bağlayan bir sıra eklemek mümkündür . Ekleme brand_id references brand
için stock
tek 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_id
tercihe 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) )