Leandro, 

> Particularmente, prefiro saber quando muda uma chave.  Melhor que as
> alterações sejam explícitas que implícitas.

Quer saber quando a chave muda? Registre alterações via trigger numa 
tabela de histórico. Teu modelo não tem nenhuma obrigação de mudar 
por causa desse desejo.

> Os problemas do CNPF são outros, geralmente: gente que não tem CNPF
> pode até ter conta bancária, por exemplo mulheres casadas com conta
> conjunta com o marido.

E isso pode mudar a qualquer momento quando os requisitos do seu sistema 
mudarem. Conheci sistemas que precisaram colocar até nome da mãe na chave 
alternativa da tabela de pessoas para evitar duplicidades. Que tal fazer 
isso na minha tabela de pessoas, com 47 filhas? Quer embutir essa tralha 
toda na chave primária e em todas as chaves estrangeiras por questão de 
purismo conceitual? Quando eu trocar o tamanho do campo vou ter de criar 
um script monstruoso que levará horas ao invés de 30 segundos digitando 
uma linha. Quando alguém digitar errado o nome do cara durante o cadastro 
e notar isso no mês seguinte, depois de lanças algumas dezenas de notas, 
devo deixar o cliente esperando a emissão de nota ficar parada porque o 
banco de dados precisa aplicar o cascade nas 47 filhas para o modelo não 
ser prejudicado? Na-na-ni-na-não.

> > Exemplos pf, engorda a base? Pelo que entendo facilita até a maneira que
> > o banco trabalha.

> Em alguns casos, já citados, sim, por limitações do SQL.  Mas na
> maioria dos casos é um atributo e um índice a mais sem necessidade, e
> mais junções.

Em TODOS os bancos de dados o tamanho do índice conta na decisão de usá-lo
ou não, e uma chave serial de 2, 4 ou 8 bytes jamais será maior do que
qualquer chave natural que se encontre para a mesma tabela. Portanto, usar
chaves naturais para fazer FKs aumenta sim o tamanho dos índices e tem toda a
chance de igualar ou piorar o desempenho.

> > Obscurece o modelo? Por favor seja mais específico.
> 
> Quem lê um modelo com chaves naturais entende tudo; quem lê um modelo
> com chaves artificiais tem de adivinhar muita coisa.

Se quer ler e entender o modelo, use a representação conceitual (modelo
lógico). Quando 
puser para funcionar, terá de lidar com o modelo *físíco*, com todas as
tabelas, índices, 
chaves artificiais, índices, triggers, visões materializadas e qualquer
outra coisa que
sirva para deixar a aplicação com um desempenho decente.

> Eu diria que é para evitar ser amaldiçoado por todas as gerações
> futuras de usuários, programadores e analistas, sem falar nos DBAs.

Estou pra conhecer um DBA que goste de rasgar SLAs com cláusulas de tempo de
resposta mínimo e mande todo mundo parar de trabalhar para esperar o banco
fazer um DELETE CASCADE
numa tabela com mais de 100000 registros.
Estou também para conhecer um DBA que seja contratado por alguém que se dê
ao luxo 
pagar um cara qualificado para dizer para o cliente "senta e chora" quando
identificar 
deadlocks causados por purismos conceituais.

> Claro!  Mas eu tenho o pressentimento de que, como está, teu sistema
> dificilmente crescerá muito, e continuará a ser mantido por ti, então
> nada do que falei se tornará visível.

3 anos é pouco pra você?! Tá bom, que tal o sistema que mantenho hoje, que
tem uns 15?
900 tabelas tá bom pra você ou é meio pequenininho pra entrar na conta?

> Na verdade, mesmo os grandes ERPs têm péssimos modelos.  Até o
> catálogo da Oracle é mal modelado.  

Catálogo do Oracle mal modelado? Quando apresentar algum mais normalizado que
faça 
o mesmo que ele e ainda por cima tenha o mesmo desempenho, avise.

> Dá para ir tocando, mas são custos ocultos.  
> Alguém os estimou globalmente em US$1,2T por ano.

Isto é apenas um número sem fonte (vulgo chute) com um valor cheio de zeros.
Chutes 
não vão convencer ninguém a mudar de idéia nem vão justificar qualquer
abordagem que
se apresente.

>> especialmente se você quiser usar a chave para
>> identificar alterações concorrentes sobre o mesmo registro

> Nível de isolamento serializável, e de quebra a aplicação fica mais
robusta.

E mais lenta, especialmente em acessos concorrentes. Nem todo mundo tem tempo,

dinheiro ou motivo para esperar.

> Agora me dei conta? será que teus problemas recorrentes de desempenho
> não são por controle de transações na aplicação?

Não, pois faço os testes de desempenho com uma única conexão a um servidor
dedicado.

>> A melhoria é grande demais para ser ignorada, pois
>> quase todos os índices ficarão menores

> Ou melhor, depende. Tabela mãe pequena e pouco usada com tabelas
> filhas grandes, pode ser, se não forçar junções demais.

Tamanho do índice entra na conta, especialmente com muitos registros tanto na
tabela pai quanto na filha.

> Mas sempre haverá um índice a mais, tanto em disco quanto em memória,
> ocupando também cache e exigindo atualizações.

O que só seria problema se a atividade mais frequente fosse atualizar as
tabelas 
ao invés de consultá-las.

>> e com distribuição estatística mais
>> evidente (do ponto de vista do banco de dados) usando uma PK numérica
>> de um só campo.

> Não.

Eu poderia dar uma resposta irrelevante como "Sim.", mas prefiro contribuir
justificando meus motivos devidamente expostos na documentação:

http://www.postgresql.org/docs/8.4/static/planner-stats.html

"One component of the statistics is the total number of entries in each table
and index, as well as the number of disk blocks occupied by each table and
index."

Logo, sim, o tamanho do índice conta, e muito, no seu uso.
Esta mesma página explica que as estatísticas consultadas são as da
pg_stats, que 
organizam os dados de UMA COLUNA por registro. Logo, se eu quiser estimar
quantos 
registros filhos há em média para cada registro pai, a estimativa com um
único 
campo será muito mais precisa que qualquer chave natural composta que se
apresente.

>> Além do mais, ninguém falou em não declarar chaves alternativas para
>> evitar duplicidades.

> Mas é o que costuma acabar acontecendo.

Não. Se o problema é esse, critique a falta de chaves alternativas, e não o
uso das chaves seriais, que não tem nada a ver com isso.


Mozart Hasse


_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a