Nie.
Powiedziałbym, że z pewnością istnieją przypadki, gdy klucze pojedynczego pola są gorsze od kluczy złożonych, przynajmniej do celów kluczy obcych . Nie oznacza to, że nie powinieneś mieć klucza zastępczego dla pojedynczego pola, jeśli wolisz, ale ja osobiście wolę klucz, który jest najczęściej używany jako cel klucza obcego, aby był nazywany kluczem podstawowym
Spróbuję zilustrować mój punkt w następujących przykładach, w których:
brand to marka samochodów, np. Ford, Toyota itp
dealer to przedstawicielstwo fizyczne związane z marką (np. przedstawicielstwo Forda sprzedające tylko Forda)
model jest rodzajem samochodu, np. Ford Focus, Ford Fiesta itp
stock to bieżąca liczba samochodów na dziedzińcu dla każdego salonu
Jeśli utworzymy klucz zastępczy dla jednego pola dla dealeri modelw następujący sposób:
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) )
wtedy można wstawić wiersz stockłączący Forda dealerz modelem „Toyota”. Dodanie brand_id references branddo stocktylko sprawia, że problem gorzej. Z drugiej strony, jeśli zachowujemy klucz obcy jako część klucza podstawowego w następujący sposób:
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 )
obecnie reguła, że dealerzy „Ford” mogą przechowywać tylko samochody „Ford”, jest naturalnie egzekwowana przez model.
Należy zauważyć, że w przykładzie „klucze złożone” dealer_idmogą, ale nie muszą być unikalne, zgodnie z preferencjami. Nie musi być unikalny (tj. Klucz alternatywny), ale bardzo mało go gubi (być może trochę miejsca do przechowywania) i może być bardzo przydatny, tak zazwyczaj go konfiguruję, np .:
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )