Entendo um benefício das chaves substitutas/artificiais em geral - elas não mudam e isso pode ser muito conveniente. Isso é verdade, sejam campos únicos ou múltiplos - desde que sejam 'artificiais'.
No entanto, às vezes parece ser uma questão de política ter um campo inteiro de incremento automático como a chave primária de cada tabela. É sempre a melhor ideia ter uma chave de campo único e por que (ou por que não)?
Para ser claro, esta questão não é sobre artificial versus natural - mas sobre se todas as chaves artificiais devem ser de um único campo
Vou dizer que não, nem sempre, mas na maioria das vezes sim. .
Estas são algumas circunstâncias em que você não precisa de uma chave substituta ou artificial:
tabela de pesquisa com uma chave de negócios exclusiva que é fixada externamente ao seu
negócio e que tem chance zero de mudar para qualquer
finalidade prática, usar a chave de negócios diretamente pode tornar
as coisas mais simples. Um exemplo pode ser uma lista de códigos de estado ou província
ou uma lista de números padrão ANSI, etc.
Há também algumas situações em que a antiga chave substituta de número inteiro crescente monotonicamente não é ideal. Você pode ter chaves que são substitutos alfanuméricos. Estes podem incluir:
Por que na maioria das vezes sim? A resposta mais fundamental para essa pergunta é que é um inferno se você precisar modificar um valor de chave primária em qualquer tabela. Como quase tudo que um usuário pode ver ou tocar está sujeito a uma atualização em algum momento, usar um valor de chave visível é convidar o inferno. Usar uma chave substituta evitará que você caia nessa armadilha.
Dito isso, lembre-se que há espaço para a YAGNI aplicar esse conceito. Você não precisa forçar tabelas de código com chaves de IDENTIDADE em todos os cantos do seu esquema, apenas no caso de alguém decidir que o símbolo de gênero masculino em sua tabela de funcionários precisa mudar de M para X ou algo bobo.
"depende"
Sim: os campos substitutos IDENTITY/AUTONUMBER são bons quando a chave natural é ampla e não numérica. Nota: isso pressupõe a fusão de "PK" e índice clusterizado que ocorre por padrão no SQL Server e Sybase, etc.
Não: muitas/muitas tabelas quando as 2 chaves pai são suficientes. Ou quando a chave natural é curta e de tamanho fixo, por exemplo, código da moeda
Claro, um ORM inteligente (leia-se: (n)Hibernate) pode superar essas regras...
Editar: lendo a pergunta novamente
Uma tabela muitos/muitos com 2 chaves pai substitutas terá uma coluna PK múltipla.
No entanto, não precisa de outra coluna substituta.
Se uma tabela tiver uma chave substituta (IDENTITY, etc.), ela não precisará ser de várias colunas.
Você pode ter uma superchave que inclua o substituto, mas isso seria para impor outras regras (por exemplo, subtipos )
Não.
Eu diria que certamente há 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ê não deva ter uma chave substituta de campo único também, se preferir, mas eu pessoalmente prefiro que a chave que é usada com mais frequência como alvo de uma chave estrangeira seja chamada de chave primária
Vou tentar ilustrar meu ponto nos seguintes exemplos, nos quais:
brand
é marca de carro, por exemplo, Ford, Toyota etcdealer
é uma concessionária física, vinculada a uma marca (por exemplo, uma concessionária Ford que vende apenas Fords)model
é o tipo de carro, por exemplo, Ford Focus, Ford Fiesta, etc.stock
é a contagem atual de carros no pátio para cada concessionáriaSe criarmos uma chave substituta de campo único para
dealer
emodel
da seguinte forma:então é possível inserir uma linha
stock
que liga um Forddealer
a um modelo "Toyota". Adicionarbrand_id references brand
astock
apenas piora o problema. Por outro lado, se mantivermos a chave estrangeira como parte da chave primária da seguinte forma:agora, a regra de que as concessionárias "Ford" só podem estocar carros "Ford" é aplicada naturalmente pelo modelo.
Observe que no exemplo 'chaves compostas',
dealer_id
pode ou não ser único, de acordo com a preferência. Não precisa ser único (ou seja, uma chave alternativa), mas muito pouco se perde ao fazê-lo (talvez um pouco de espaço de armazenamento) e pode ser muito útil, então é assim que costumo configurá-lo, por exemplo: