[firebase-br] OFF - Opinião sobre tabelas...

Pedro news.pj em gmail.com
Sex Maio 26 17:30:20 -03 2006


Vou comentando logo abaixo, nas entrelinhas...

At,
Pedro.

2006/5/26, Arno <arno35 em gmail.com>:
> Olá pessoal,
>
> tenho acompanhado a lista a algum tempo e tenho percebido que esta é uma
> lista muito boa, talvez uma das melhores do país.
>
> Por isso, venho pedir uma ajuda sobre modelagem de banco de dados, peguei um
> sistema para dar manutenção, ele está rodando o Delphi 6 + zeoslib 5.5 +
> mysql 4.0.

Seu sistema é codificado em delphi 6 utilizando a biblioteca zeoslib
5.5  e acessando banco de dados mysql 4.

>
> Estou mudando todo o banco, tornando ele um banco relacional, porque da
> forma como se encontra hoje, ele não tem integridade de chave entre as
> tabelas.

Até onde eu sei o mysql tb é um banco de dados relacional. Vide
http://dev.mysql.com/doc/refman/4.1/pt/what-is.html . Talvez o que vc
pretenda seja normalizar o banco.

>
> Para isso estou utilizando o Delphi 6 + zeoslib 6.1 + firebird 1.53.

>

Fez uma boa opção.

> Mas o meu problema está no seguinte:
>
> Tem duas tabelas em uma parte semi-contábil do sistema, que controlam os
> títulos a pagar e a receber.
>
> Hoje, a cada novo título lançado no sistema, é feito automaticamente o
> número de lançamentos correspondentes a quantidade de parcelas, por exemplo:
> se um título tiver parcela única, será efetuado um único lançamento dentro
> do banco mas, se um título tiver duas ou mais parcelas, é feito o lançamento
> do mesmo título tantas vezes quanto forem o número de parcelas.
>
> Para efetuar a baixa, o sistema escreve em outra tabela, uma cópia do título
> digitado acima, e faz a baixa do mesmo, ou seja, ele está reescrevendo o
> registro do lançamento e anexando alguns campos, como data da baixa e
> outros...
>
> Basicamento o desenho das tabelas são estes:
>
> =====================================================
> tabela titulos
> id               -> chave primária
> idclifor      -> chave da tabela de clientes/fornecedores
> nrdoc        -> nr do documento
> datalanc  -> data do lançamento
> tipodoc     -> tipo do documento
> valor          -> valor da parcela
> valordoc   -> valor total do documento
> nrparcela -> número da parcela
> qparcela  -> quantidade de parcelas
>
> tabela de movimentação
> id                -> chave primária
> idclifor       -> chave da tabela de clientes/fornecedores
> nrdoc         -> número do documento
> databaixa  -> data da baixa do documento
> tipodoc      -> tipo do documento
> valor           -> valor da parcela
> nrparcela  -> número da parcela
> ========================================================
>
> Entre outros campos, estes são os principais.
>
> Bom, montei um modelo relacional no qual o título era lançado uma única vez
> dentro da tabela de títulos, não havendo mais a repetição de campos e
> registros, e de acordo com a quantidade de parcelas era feito o lançamento
> dentro da tabela de movimentação, aguardando assim a data da baixa com o
> respectivo número da parcela, deste modo o cliente pode escolher qual
> parcela pagar, como ainda é feito hoje. Ou seja, a tabela de movimentação
> ficou com uma chave estrangeira da tabela de títulos e sem os campos
> repetidos.
>

Alguns acreditam que ter redundância de campos pode trazer ganho de
performance. E não deixa de ser verdade, apesar de ferir as formas
normais, por evitar buscas cruzadas entre as tabelas que provocam uma
certa perda de tempo. Por outro lado o controle sobre os dados nesses
campos muitas vezes passa para a aplicação. Ou seja, mais trabalho
para o programador ou o para o DBA, que pode tentar ajudar manter as
coisas no lugar através de triggers ou SPs. Assim, pode-se tornar
inserções, edições e exclusões mais lentas pelo volume de restrições e
operações a serem realizadas antes ou durante o processo. Mas isso me
parece bastante relativo. Acho que o que se deve fazer é pesar o que
se quer em termos de performance em detrimento da simplificação da
codificação, pq além de tudo complica para manutenção futura.
Normalizar o banco é o ideal, mas nem sempre temos um oracle nas mãos.
Ainda é necessário um certo malabarismo para lidar com performance em
bancos como o firebird para baixo quando se trata de milhoões de
registros. Se bem que lidar com milhões de registros não é mole em
nenhum SGBD...

Enfim, o modelo transacional deve ser o mais enxuto possível para se
ter ganho de performance se o foco é o cadastro, modificação ou
exclusão de dados. É a hora de cuidar de integridade referencial,
normalização, etc... Se o foco está nas consultas em sistemas
informações gerenciais, vale a pena aplicar os conceitos de
datawarehouse, olap, enfim, business intelligence. Só que aí a
modelagem é outra e os mecanismos de coleta de dados também. É outra
história.

Acho que vale a pena tentar entender pq as coisas estão como estão...

> Na semana passada percebí um problema neste sistema que estou montando. Como
> a quantidade de parcelas determina o número de lançamentos dentro da tabela
> de movimentação, o sistema não comporta pagamento de parcelas parciais, ou
> seja, se uma parcela for de R$ 300,00 e for efetuado o pagamento de somente
> R$ 200,00, ficam sobrando R$ 100,00 que não tenho aonde colocá-lo. E isso é
> uma prática comum para este cliente.
>
> Bom, tenho que repensar estas duas tabelas novamente, e estou precisando de
> uma ajuda, se alguém tiver uma idéia ou sugestão de como resolver o problema
> e quiser compartilhá-lha, pode entrar em contato em pvt comigo.
> arno35 em gmail.com
>

Vale a pena passar o olho em Yourdon, Análise Estruturada Moderna.

> Agradeço a todos que perderam tempo lendo este jornal...
>

Que nada! Isso ajuda a praticar o que nos diferencia dos macacos.

> Arno.
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>




Mais detalhes sobre a lista de discussão lista