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 dealere modelcome 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 stockche collega una Ford dealera un modello "Toyota". L'aggiunta brand_id references branda stocknon 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_idpuò 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) )