No.
Diría que ciertamente hay casos en que las claves de campo único son inferiores a las claves compuestas, al menos para el propósito de claves externas . Eso no quiere decir que no debería tener una clave sustituta de un solo campo también si lo prefiere, pero personalmente prefiero que la clave que se usa con más frecuencia como destino de una clave externa se llame clave primaria
Intentaré ilustrar mi punto en los siguientes ejemplos, en los que:
brand
es la marca del automóvil, por ejemplo, Ford, Toyota, etc.
dealer
es un concesionario físico, vinculado a una marca (por ejemplo, un concesionario Ford que solo vende Ford)
model
es el tipo de automóvil, por ejemplo, Ford Focus, Ford Fiesta, etc.
stock
es el recuento actual de automóviles en la explanada de cada concesionario
Si creamos una clave sustituta de campo único para dealer
y de la model
siguiente manera:
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) )
entonces es posible insertar una fila stock
que vincule un Ford dealer
con un modelo "Toyota". Agregar brand_id references brand
a stock
solo empeora el problema. Por otro lado, si mantenemos la clave externa como parte de la clave primaria de la siguiente manera:
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 )
ahora la regla de que los concesionarios "Ford" solo pueden almacenar autos "Ford" se aplica naturalmente por el modelo.
Tenga en cuenta que en el ejemplo de 'claves compuestas', dealer_id
puede o no ser único, de acuerdo con las preferencias. No necesita ser único (es decir, una clave alternativa), pero se pierde muy poco al hacerlo (tal vez un poco de espacio de almacenamiento) y puede ser muy útil, por lo que esa es la forma en que generalmente lo configuro, por ejemplo:
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )