Em 28 de abril de 2015 17:30, Matheus Saraiva
<matheus.sara...@gmail.com> escreveu:
>
> Já vi muita gente criticando as chaves artificiais e aconselhando o uso
> de chaves naturais simples ou mesmo compostas.

São duas questões separadas.

Não é possível criticar as chaves artificiais, assim como não é
possível criticar, digamos, o oceano Atlântico.  São um fato da vida.
O que se critica é o abuso delas.

Chaves artificiais foram primeiro imaginadas como um recurso para os
DBAs implementarem por debaixo dos panos, como equivalentes a uma
chave natural composta ou, por algum outro motivo, relativamente
ineficiente.  Não era para ser visível no modelo lógico de dados, e
portanto nem aplicações, nem usuários a veriam.

Entretanto, infelizmente o SQL — ou, pelo menos, suas atuais
implementações — não permite separar direito os modelos lógico e
físico; assim, começou-se a criar chaves artificiais como complementos
visíveis, em vez de como implementações invisíveis, de chaves
naturais.  Até aí, o pressuposto seria que, além de uma chave
artificial, sempre haveria ao menos uma chave natural em cada relação
(‘tabela’).

O problema é que hoje em dia a maior parte dos usuários nem se
preocupa em definir uma chave natural por relação que seja.  Isso leva
a vários problemas, dos quais o mais imediato é a possibilidade de
duplicação de dados, e o mais importante é o desconhecimento do
próprio modelo de dados (do qual ao menos uma chave natural por
relação é parte essencial).

Outra maneira de ver a coisa: uma chave artificial não é uma chave de
verdade, a menos que corresponda a uma chave natural declarada,
implementada e operante, uma vez que não cumpre a função básica de uma
chave, que é garantir unicidade.  Em inglês, isso fica claro no nome
/surrogate/, que é um substituto, um procurador; será que seria o caso
de pararmos de as chamarmos de ‘artificiais’ e usarmos algo mais
próximo de uma tradução de /surrogate/, como ‘substituto’ ou
‘complementar’?  Não sei qual seria uma tradução que restringisse a
interpretação à original; talvez ‘por procuração’?


> Uma chave natural composta de (email, cnpj, nome). Isso não causaria
> redundâncias de dados, aumentaria o consumo de espaço em disco e
> prejudicaria o desempenho?

Não, isso evita duplicidade e é essencial.  A chave artificial é que,
por definição, é redundante (desnecessária); e a falta de declaração
duma chave natural leva a validações em aplicação, que geralmente são
piores que as feitas pelo SGBD.


> Visto que é mais leve e performático gravar,
> duplicar e fazer transações com um INTEGER do que em um conjunto de três
> VARCHAR?

Não necessariamente.  Você já conduziu os testes comparando?  Já
verificou o contraste entre usar uma chave natural e a validação em
aplicação?  Já verificou quantas junções o uso de chaves naturais
evita?  E os custos decorrentes de manutenção necessária pela má
compreensão do modelo ao longo da vida útil da base?

Geralmente, a disciplina de definir chaves naturais em cada relação
ajuda a normalizar a base, tornando o sistema como um todo mais leve,
mais lógico e mais robusto.  Mesmo que num caso ou noutro tenha de se
complementar as chaves naturais com uma ou outra artificial.


> E se o servidor for modesto? Se o espaço de armazenamento for um
> requisito crítico?

Tire a artificial, se for o caso.  Mas lembre-se da máxima: otimização
precoce é raiz de toda sorte de males.


-- 
skype:leandro.gfc.dutra?chat      Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191              gTalk: xmpp:leand...@jabber.org
+55 (61) 9302 2691        ICQ/AIM: aim:GoIM?screenname=61287803
BRAZIL GMT−3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a