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 dealer
i model
w 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 dealer
z modelem „Toyota”. Dodanie brand_id references brand
do stock
tylko 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_id
mogą, 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) )