fundo
A abordagem "all-PK-must-be-surrogates" não está presente no Modelo Relacional do Codd nem em nenhum Padrão SQL (ANSI, ISO ou outro).
Os livros canônicos parecem iludir essas restrições também.
O próprio esquema de dicionário de dados da Oracle usa chaves naturais em algumas tabelas e chaves substitutas em outras tabelas. Menciono isso porque essas pessoas devem saber uma coisa ou duas sobre o design do RDBMS.
O PPDM (Associação Profissional de Gerenciamento de Dados de Petróleo) recomenda os mesmos livros canônicos que:
Use chaves substitutas como chaves primárias quando:
- Não há chaves naturais ou comerciais
- As chaves naturais ou comerciais são ruins (altere frequentemente)
- O valor da chave natural ou comercial não é conhecido no momento da inserção do registro
- As chaves naturais de várias colunas (geralmente várias FK) excedem três colunas, o que torna as junções muito detalhadas.
Também não encontrei uma fonte canônica que diga que as chaves naturais precisam ser imutáveis. Tudo o que acho é que eles precisam ser muito estáveis, ou seja, precisam ser alterados apenas em ocasiões muito raras, se é que alguma vez ocorreram.
Mencionei o PPDM porque essas pessoas também devem saber uma coisa ou duas sobre o design do RDBMS.
As origens da abordagem "todos os substitutos" parecem vir das recomendações de algumas estruturas do ORM.
É verdade que a abordagem permite modelagem rápida de banco de dados , não sendo necessário fazer muitas análises de negócios, mas à custa da capacidade de manutenção e legibilidade do código SQL. Muita previsão é feita para algo que pode ou não acontecer no futuro (a PK natural mudou, teremos que usar a funcionalidade de atualização em cascata do RDBMS) em detrimento da tarefa diária, como ter que juntar mais tabelas em todos os consultar e ter que escrever código para importar dados entre bancos de dados, um procedimento bastante direto (devido à necessidade de evitar colisões de PK e ter que criar tabelas de estágio / equivalência antecipadamente).
Outro argumento é que os índices baseados em números inteiros são mais rápidos, mas isso precisa ser suportado com benchmarks. Obviamente, varchars longos e variados não são bons para PK. Mas índices baseados em varchar curto e de tamanho fixo são quase tão rápidos quanto números inteiros.
As questões
- Existe alguma fonte canônica que suporte a abordagem "todos os PK devem ser substituídos"?
- O modelo relacional de Codd foi substituído por um modelo relacional mais novo?
fonte
TablenameID
" funciona muito, muito bem. Vi isso trabalhando na prática com um banco de dados de tamanho corporativo com mais de 500 tabelas e, desde então, uso isso para modelagem de banco de dados sempre que possível.Respostas:
"Todas as PKs são substitutas" não é uma estratégia muito sólida e certamente não é uma estratégia para a qual você provavelmente encontrará uma fonte "autorizada" .
Em primeiro lugar, pense no que se entende por "chave primária" nesse contexto. No modelo relacional, não há chaves "primárias" - ou seja, nenhuma chave que seja fundamentalmente diferente de qualquer outra chave da mesma tabela. Em princípio, todas as chaves em um banco de dados relacional podem e gozam do mesmo status e têm os mesmos recursos e funções, exceto na medida em que o designer do banco de dados escolher o contrário. A escolha de qualquer tecla em uma tabela com várias teclas é, portanto, essencialmente arbitrária (que era a palavra usada pelo EFCodd), subjetiva e puramente psicológica (a visão de Chris Date, colega e colaborador de Codd). A menos que seja explicado que distinção está sendo traçada entre uma chave "primária" e qualquer outra chave, ela não faz sentido e não tem mérito algum em afirmar que essa chave "
Em segundo lugar, o argumento tem muito pouco a ver com índices, que são um recurso de armazenamento físico. As chaves são uma questão lógica, não física e não há razão absoluta para supor que as considerações de armazenamento de uma chave "primária" sejam ou devam ser diferentes de outras chaves (consulte o parágrafo anterior). Podemos razoavelmente supor que, quaisquer que sejam as estruturas de armazenamento usadas, a sobrecarga de armazenamento será, em certa medida, maior com uma chave substituta do que sem essa chave, mas como sempre a melhor resposta aqui é "depende". As decisões de armazenamento devem ser tomadas caso a caso e regras gerais são de pouca ajuda.
Terceiro, de um ponto de vista lógico, o requisito absoluto de uma chave substituta faz muito pouco sentido. O requisito para uma chave natural é exatamente o mesmo com ou sem um substituto. A necessidade de informações serem identificáveis no domínio do discurso (ou seja, com uma chave natural AKA "chave comercial", "chave do domínio") é a mesma. Sim, as chaves podem precisar ser atualizadas, mas às vezes é essa a natureza das coisas. A adição de um substituto por si só não torna necessariamente mais fáceis as atualizações de chaves e, às vezes, pode dificultá-las.
fonte
Chaves primárias e estrangeiras não precisam ser legíveis. Seu objetivo é manter a estrutura relacional interna do banco de dados, para não ser lida por um ser humano.
Naturalmente, se houver uma chave natural apropriada que nunca será alterada (afirmo que são tão raras quanto os dentes de galinha ou os trevos de quatro folhas, mas ...), você pode usá-la e alguns clientes farão disso um de seus requisitos. .
Mas por que adicionar complexidade adicional a um sistema de banco de dados, para pouco benefício apreciável? As chaves substitutas primárias são geradas pelo sistema, garantidas como únicas, com garantia de nunca serem alteradas e com o mesmo tipo de dados para todas as tabelas. Eles terão o mesmo comportamento confiável em todas as circunstâncias.
Se você estiver procurando por um recurso canônico que ofereça suporte a essa prática, não o encontrará. Existem tantos designers do outro lado do corredor que defenderão cruelmente o uso de chaves compostas naturais com índices agrupados como chaves primárias, e todos os recursos canônicos dizem que é a escolha do designer.
Veja também
http://en.wikipedia.org/wiki/Surrogate_key
fonte