Nem o SQL nem o modelo relacional são perturbados por chaves estrangeiras que fazem referência a uma chave natural. De fato, referenciar chaves naturais geralmente melhora drasticamente o desempenho. Você ficaria surpreso com a frequência com que as informações necessárias estão completamente contidas em uma chave natural; referenciar essa chave negocia uma junção para uma tabela mais ampla (e consequentemente reduz o número de linhas que você pode armazenar em uma página).
Por definição, as informações que você precisa estão sempre completamente contidas na chave natural de cada tabela de "pesquisa". (O termo tabela de pesquisa é informal. No modelo relacional, todas as tabelas são apenas tabelas. Uma tabela de códigos postais dos EUA pode ter linhas com esta aparência: {AK, Alaska}, {AL, Alabama}, {AZ, Arizona} etc. A maioria das pessoas chama isso de tabela de pesquisa.)
Em grandes sistemas, não é incomum encontrar tabelas com mais de uma chave candidata. Também não é incomum que as tabelas que atendem a uma parte da empresa façam referência a uma chave candidata e as tabelas que atendem a outra parte da empresa façam referência a uma chave candidata diferente. Esse é um dos pontos fortes do modelo relacional e faz parte do modelo relacional que o SQL suporta muito bem.
Você terá dois problemas ao fazer referência a chaves naturais em tabelas que também possuem uma chave substituta.
Primeiro, você surpreenderá as pessoas. Embora eu geralmente faça um forte lobby pelo Princípio da Menor Surpresa , essa é uma situação em que não me importo de surpreender as pessoas. Quando o problema é que os desenvolvedores ficam surpresos com o uso lógico de chaves estrangeiras, a solução é educação, não redesenho.
Segundo, os ORMs geralmente não são projetados com base no modelo relacional e, às vezes, incorporam suposições que não refletem as melhores práticas. (De fato, eles geralmente parecem ter sido projetados sem a participação de um profissional de banco de dados.) Exigir um número de identificação em todas as tabelas é uma dessas suposições. Outro está assumindo que o aplicativo ORM "possui" o banco de dados. (Portanto, é gratuito criar, excluir e renomear tabelas e colunas.)
Trabalhei em um sistema de banco de dados que serviu dados para centenas de programas aplicativos escritos em pelo menos duas dúzias de idiomas durante um período de 30 anos. Esse banco de dados pertence à empresa, não a um ORM.
Uma bifurcação que introduz alterações de última hora deve ser uma barreira.
Avaliei o desempenho com chaves naturais e substitutas em uma empresa em que trabalhava. Há um ponto de inflexão no qual as chaves substitutas começam a superar as chaves naturais. (Presumindo que não haja esforço adicional para manter alto o desempenho da chave natural, como particionamento, índices parciais, índices baseados em funções, espaços de tabela extras, usando discos de estado sólido, etc.) Pelas minhas estimativas para essa empresa, eles atingirão esse ponto de inflexão em por volta de 2045. Enquanto isso, eles obtêm melhor desempenho com chaves naturais.
Outras respostas relevantes: No Esquema do Banco de Dados Confuso
Se você não souber a resposta, vá com o substituto. Aqui está o porquê - se forem feitas suposições sobre regras de negócios, e essas suposições forem falsas ou as regras mudarem, seus dados serão lixo. Aqui está um exemplo:
Pessoa, função, PersonRole
A regra de negócios atual afirma que uma Pessoa tem uma Função. Você cria uma tabela que vincula Person e Role em que PersonRole (PersonName, PersonBirthDate, PersonMotherMaidenName, ..., RoleCode)
Agora você é um verdadeiro purista quando se trata de Chaves Naturais! Mas, falando sério, e se a organização decidir que uma pessoa agora pode assumir vários papéis? Quais são os efeitos posteriores do suporte à mudança nas necessidades dos negócios?
fonte