Re: [pgbr-geral] RES: RES: Chave Primaria Composta

2016-08-25 Por tôpico Guimarães Faria Corcete DUTRA , Leandro
2016-08-25 15:31 GMT-03:00 Márcio A. Sepp :
>
>> Sim, eu entendo a "vantagem" de evitar join e você "ter" o dado já na filha 
>> ou "neta" da tabela.
>
> Gostaria de citar um exemplo prático:
[…]
> Na tabela lancamentoccu a coisa fica pior ainda, pois vc precisará também 
> criar uma referência para a tabela lote. Caso contrário vc sacrifica a 
> integridade da aplicação.
>
> Por favor, Dutra, Adami e demais...  critiquem as minhas afirmações acima?

Não vou criticar não, para mm está bom.  É isso aí.


> O que daria também pra gente fazer é criar um banco de testes e verificar 
> como ficam as coisas após uma certa carga. Daí mata isso de vez.

Testar e experimentar sempre é bom, mas o que estamos falando já foi
verificado à exaustão — além de decorrer do próprio modelo relacional
e conceitos decorrentes.


-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191  gTalk: xmpp:leand...@jabber.org
+55 (61) 9302 2691ICQ/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

[pgbr-geral] RES: RES: Chave Primaria Composta

2016-08-25 Por tôpico Márcio A . Sepp


> Sim, eu entendo a "vantagem" de evitar join e você "ter" o dado já na filha 
> ou "neta" da tabela.
> Mas assim, no que eu vi, na prática é o seguinte:
> 1 - A informação da chave, geralmente não é a que vc quer, então o join vai 
> acontecer igual


Gostaria de citar um exemplo prático:
Criar estrutura de 03 tabelas conforme entendido hoje na explanação do Dutra e 
do Tiago.

-- Tabela do lote contábil
CREATE TABLE public.lote
(
   documento character varying(20) NOT NULL, 
   data date, 
   PRIMARY KEY (documento)
);


-- Tabela de lançamentos contábeis
CREATE TABLE public.lancamento
(
   documento character varying(20) NOT NULL, 
   conta integer NOT NULL, 
   natureza character(1) NOT NULL, 
   valor numeric(10,2) NOT NULL,
   PRIMARY KEY (documento, conta, natureza), 
   FOREIGN KEY (documento) REFERENCES public.lote (documento) ON UPDATE CASCADE 
ON DELETE NO ACTION
);

(veja bem, a intenção aqui não é discutir o meu entendimento da contabilidade, 
é apenas mostrar um desenho ficticio de uma aplicação. Na prática pode e talvez 
deva ser diferente a estrutura)


-- Lançamento no centro de custo
CREATE TABLE public.lancamentoccu
(
   documento character varying(20), 
   conta integer, 
   natureza character(1), 
   codigo_ccu integer, 
   valor numeric(10,2) NOT NULL, 
   PRIMARY KEY (documento, conta, natureza, codigo_ccu), 
   FOREIGN KEY (documento, conta, natureza) REFERENCES public.lancamento 
(documento, conta, natureza) ON UPDATE CASCADE ON DELETE NO ACTION
);


Neste modelo, se eu quiser saber o total que foi debitado de um centro de custo 
em um determinado mês eu não preciso envolver a tabela de lançamento, pois a 
data está na tabela lote e o restante da informação que eu preciso está na 
tabela de lancamentoccu. (Não sei se essa prática é boa ou não...  por favor, 
comentem...), mas que é possível é... 

Agora, se eu tiver id em todas as tabelas, necessariamente será preciso passar 
por todas elas para chegar onde está a informação. Aí sim aumenta *muito* o 
tempo. 


> 2 - Os índices ficam bem maiores 
Sim. Porém no mesmo modelo acima, se eu não utilizasse chaves naturais eu teria 
de fazer da seguinte forma:

-- Tabela do lote contábil
CREATE TABLE public.lote
(
  id integer serial,
  documento character varying(20) NOT NULL,
  data date,
  CONSTRAINT PRIMARY KEY (id),
  CONSTRAINT UNIQUE (documento)
);

Observe que tem de criar o campo id a mais (que tbm consumirá espaço) e uma 
constraint no campo documento (que tbm consumirá espaço).
Já nas outras tabelas vc terá de, além de criar um campo a mais (id), também 
terá de criar uma fk pra tabela pai.

Na tabela lancamentoccu a coisa fica pior ainda, pois vc precisará também criar 
uma referência para a tabela lote. Caso contrário vc sacrifica a integridade da 
aplicação.

Por favor, Dutra, Adami e demais...  critiquem as minhas afirmações acima?

> 3 - Vc tem uma redundância de informações e maior consumo de espaço
> 4 - A escrita (lembrando de modelos grandes) fica bem maior, supondo que você 
> precise unir 30 tabelas cada uma com 10 campos na sua chave,  > pense no 
> tamanha da instrução.
> O sistema em questão que eu citei anteriormente tem todos esses problemas e 
> hoje é um verdadeiro elefante branco.

O que daria também pra gente fazer é criar um banco de testes e verificar como 
ficam as coisas após uma certa carga. Daí mata isso de vez.


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

[pgbr-geral] RES: RES: Chave Primaria Composta

2016-08-25 Por tôpico Márcio A . Sepp
> Márcio, quando for citar algo que alguém mais escreveu, marque para
> evitar confusão.

Desculpe, consegui acertar agora meu leitor de emails pra isso...  tempo já que 
tava procurando. 

> 
> > Vou dar uma pitada aqui, embora não sou bem um conhecedor da área. A
> > meu ver, justamente vc colocando mais atributos na chave primária
> deveria deixar as consultas mais rápidas (se vc utilizar os campos da
> chave no where) e, como consequencia, talvez iria utilizar mais o disco
> para armazenamento (falando a grosso modo).
> 
> Não.
> 
> Os atributos de uma chave por definição já existem no disco.  A rigor,
> é a chave artificial, apesar de poder ser simples, que representa
> desperdício, visto que tem de ser definida (incluindo índice) além das
> chaves naturais (nunca as substituindo!), sejam estas compostas ou
> simples.
> 
> A eventual economia de armazenamento seria para o caso de tabelas
> ‘pai’, que ‘exportariam’ apenas um atributo para as ‘filhas’.  Mas essa
> economia geralmente é mais que contrabalançada por haver índice e
> atributo adicional nas tabelas pais, e pelo fato de que chaves
> artificiais quase sempre exigem mais junções, visto que as chaves
> estrangeiras nas tabelas filhas não contém informações úteis; e pelo
> fato de que geralmente as pessoas acabam não definindo chaves naturais
> quando definem as artificiais, o que gera, além de inconsistências,
> necessidade de tratar integridade na aplicação, o que é muito
> ineficiente.
 
Exato. Tenho visto bastante a utilização de "id" pra tudo. Consequentemente 
grande lentidão e falta de integridade. 


> Não entendi, comentar o quê?  Sem os significados, e o resto da
> estrutura e explicações, é impossível dizer qualquer coisa.  Modelagem
> de dados é o tipo de coisa muito difícil de fazer remotamente
> justamente pela quantidade de informações necessárias.

Viche... desculpe. Essa parte não era pra ter ido na verdade...  

 
> Em termos gerais, amiúde uma chave composta grande pode indicar falta
> de normalização, e portanto ou desatenção de quem modelou, ou
> desconhecimento — geralmente as pessoas entendem mal as formas normais,
> e até desconhecem qualquer coisa além da 3NF.  Só para lembrar, há sete
> formas normais (as 5NFs originais, a Boyce-Codd e a temporal, esta de
> difícil aplicação), mas geralmente o bom senso e uma análise atenta dá
> bons resultados mesmo conhecendo apenas as três primeiras formas
> normais.
> 
> Mas de fato há situações em que uma chave pode chegar a cobrir todos os
> atributos (naturais) de uma relação (não confundir com relacionamento).


Da minha parte, Dutra, hoje vc sanou todas as dúvidas que eu tinha. Tempos 
atrás, quando eu havia questionado pela primeira vez, não havia ficado claro e 
não me senti a vontade pra voltar a lista. Hoje está perfeito! 

Obrigado a todos.


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