Não.
Eu diria que certamente existem casos em que as chaves de campo único são inferiores às chaves compostas, pelo menos para fins de chaves estrangeiras . Isso não quer dizer que você também não deve ter uma chave substituta de campo único, se preferir, mas eu pessoalmente prefiro que a chave mais usada como destino de uma chave estrangeira seja chamada de chave primária.
Tentarei ilustrar meu argumento nos seguintes exemplos, nos quais:
brand
é marca de carro, por exemplo, Ford, Toyota etc
dealer
é uma concessionária física, ligada a uma marca (por exemplo, uma concessionária Ford que vende apenas Ford)
model
é o tipo de carro, por exemplo, Ford Focus, Ford Fiesta, etc.
stock
é a contagem atual de carros no pátio de cada concessionária
Se criarmos uma chave substituta de campo único para dealer
e da model
seguinte forma:
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) )
então é possível inserir uma linha stock
que liga um Ford dealer
a um modelo "Toyota". Adicionando brand_id references brand
a stock
só torna o problema pior. Por outro lado, se mantivermos a chave estrangeira como parte da chave primária, da seguinte maneira:
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 )
agora a regra de que os revendedores "Ford" só podem estocar carros "Ford" é aplicada naturalmente pelo modelo.
Observe que no exemplo de 'chaves compostas', dealer_id
pode ou não ser exclusivo, de acordo com a preferência. Ele não precisa ser único (ou seja, uma chave alternativa), mas muito pouco é perdido ao fazê-lo (talvez um pouco de espaço de armazenamento) e pode ser muito útil, por isso é o modo como geralmente o configuro, por exemplo:
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )