Non.
Je dirais qu'il y a certainement des cas où les clés à un seul champ sont inférieures aux clés composées, du moins pour les clés étrangères . Cela ne veut pas dire que vous ne devriez pas avoir de clé de substitution à champ unique si vous préférez, mais je préfère personnellement que la clé qui est le plus souvent utilisée comme cible d'une clé étrangère soit appelée clé primaire.
Je vais essayer d’illustrer mon propos dans les exemples suivants, dans lesquels:
brand
est une marque de voiture, par exemple Ford, Toyota, etc.
dealer
est un concessionnaire physique lié à une marque (par exemple, un concessionnaire Ford vendant uniquement des Ford)
model
est le type de voiture, par exemple Ford Focus, Ford Fiesta, etc.
stock
est le nombre actuel de voitures de parc pour chaque concessionnaire
Si nous créons une clé de substitution à champ unique pour dealer
et model
comme suit:
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) )
alors il est possible d'insérer une rangée dans stock
qui relie une Ford dealer
à un modèle "Toyota". Ajouter brand_id references brand
à stock
ne fait qu'aggraver le problème. Par ailleurs, si nous conservons la clé étrangère dans la clé primaire comme suit:
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 )
maintenant, la règle selon laquelle les concessionnaires "Ford" ne peuvent stocker que des voitures "Ford" est naturellement appliquée par le modèle.
Notez que dans l'exemple «clés composites», il dealer_id
est possible que les préférences soient uniques ou non. Il n’est pas nécessaire qu’il soit unique (c’est-à-dire une clé alternative), mais vous perdez très peu de choses (peut-être un peu d’espace de stockage) et cela peut être très pratique, c’est ainsi que je l’utilise habituellement, par exemple:
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )