No.
Direi che ci sono certamente casi in cui le chiavi a campo singolo sono inferiori alle chiavi composte, almeno ai fini delle chiavi esterne . Questo non vuol dire che non dovresti avere anche una chiave surrogata a campo singolo se preferisci, ma personalmente preferisco che la chiave che viene più spesso utilizzata come target di una chiave esterna sia chiamata chiave primaria
Cercherò di illustrare il mio punto nei seguenti esempi, in cui:
brand
è marchio automobilistico, ad esempio Ford, Toyota ecc
dealer
è una concessionaria fisica, legata a un marchio (ad esempio una concessionaria Ford che vende solo Ford)
model
è il tipo di auto, ad esempio Ford Focus, Ford Fiesta ecc
stock
è il conteggio delle auto del piazzale attuale per ogni concessionaria
Se creiamo una chiave surrogata a campo singolo per dealer
e model
come segue:
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) )
quindi è possibile inserire una riga stock
che collega una Ford dealer
a un modello "Toyota". L'aggiunta brand_id references brand
a stock
non fa che peggiorare il problema. D'altra parte se manteniamo la chiave esterna come parte della chiave primaria come segue:
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 )
ora la regola secondo cui i concessionari "Ford" possono rifornire solo auto "Ford" è applicata naturalmente dal modello.
Si noti che nell'esempio delle "chiavi composite", dealer_id
può essere o non essere univoco, in base alle preferenze. Non ha bisogno di essere univoco (cioè una chiave alternativa), ma si perde molto poco rendendolo tale (forse un po 'di spazio di archiviazione) e può essere molto utile, così è il modo in cui lo installo di solito, ad esempio:
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )