Existe uma fonte canônica apoiando "todos os substitutos"?


8

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:

  1. Não há chaves naturais ou comerciais
  2. As chaves naturais ou comerciais são ruins (altere frequentemente)
  3. O valor da chave natural ou comercial não é conhecido no momento da inserção do registro
  4. 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?


"autoritário" pode ser um termo melhor que "canônico". O último termo implica que estamos discutindo um projeto específico ou uma filosofia nomeada, em vez de uma regra geral de design de banco de dados.
DougM

6
Bem, eu não conheço uma fonte canônica, mas, para minha experiência, os "todos-devem-ser-substitutos", para ser mais preciso, "o PK deve sempre ser um campo gerado automaticamente chamado 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.
Doc Brown)

2
Respostas: 1) Não! 2) Ainda maior NÃO !
Nvogel

5
Tem que dar a esta pergunta um grande -1. O fato de as chaves substitutas não serem exigidas pelos dbms é um indicador de que elas não são obrigatórias. Dito isto, como outros já apontaram, usá-los de forma consistente é uma idéia inteligente e ajuda a evitar complicações no caminho à medida que os dados mudam.
precisa

A palavra "substituto" é usada em mais de um sentido neste contexto. No uso inicial, uma chave natural foi descrita como um substituto para uma entidade. Entidades, como pessoas ou aviões, não são realmente inseridas no banco de dados. Eles não são dados. A chave natural identifica uma entidade e é dados. Portanto, pode representar a entidade dentro do banco de dados. Desde que, naturalmente, a empresa não gerencie mal a chave natural. O uso posterior usa a palavra "substituto" no sentido de que uma chave artificial é usada como substituto da chave natural.
Walter Mitty

Respostas:


9

"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.


excelente resposta. Há muito mais a ser dito sobre essa questão, mas prolongar sua resposta não a tornaria melhor. Você resumiu bem os pontos essenciais.
Walter Mitty

13

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


2
@Bobson: Eu já afirmei em minha resposta que existem opiniões divergentes e concordo com sua posição no parágrafo abaixo da declaração que você citou, para que seu voto negativo pareça ... caprichoso.
Robert Harvey

2
"Chaves Primárias e Estrangeiras não devem ser legíveis." !! Quem exatamente está "supondo" uma coisa dessas, além de Robert? A questão é sobre o modelo relacional que certamente nunca, jamais supôs tal coisa.
Nvogel

3
@sqlvogel [suspiro] Torne-os legíveis, se desejar. Sério, está tudo bem. Contanto que você possa garantir imutabilidade e exclusividade, você pode pintá-las de verde para todos os cuidados. Meu argumento é que a legibilidade é realmente baixa na escala de importância.
Robert Harvey

2
@RobertHarvey É claro. Também não há objeção a ouvir suas opiniões, mas sua primeira frase parece um pouco demais, como se você estivesse afirmando alguma propriedade ou intenção implícita dessas coisas. Novamente, como outros já disseram, "imutabilidade" não é um requisito. Estabilidade (um termo relativo, não absoluto) é um atributo útil ou desejável da chave; a imutabilidade não é e é ilusória.
Nvogel

3
@RobertHarvey, Se você não estiver familiarizado com situações em que não usar uma barriga de aluguel é uma opção melhor, algumas pessoas podem concluir que você não está em melhor posição para aconselhar quando ou quando não usá-las. Não tenho intenção de comentar nada escrito em Witless-pedia.
Nvogel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.