Autor Tópico: Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?  (Lida 6710 vezes)

Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1659
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Bom dia,
Iniciei minha atividade de hobista em programação e com banco de dados em 1992 com dbase III.
De la para cá muita coisa mudou. E comecei a práticar meu hobby com SGDB´s de verdade, não considero DBF como SGDB.
Mas vi duas práticas:
1) Alguns criam tabelas para cada situação: fornecedor, clientes, prestados de serviço, transportadora.
Neste sistema se uma PJ é fornecedor e cliente ao mesmo tempo haverá dois cadastros.
2) Outros preferem deixar tudo numa mesma tabela e so adicionam campos para marcar se são clientem, fornecedores e etc.
Neste sistema se uma PJ é fornecedor e cliente ao mesmo tempo haverá somente um cadastro e basta marcar nos campos apropriados da tabela o que a pessoa jurídica é.
Qual a vantagem de cada sistema? Em que caso pode-se aplicar cada um? Em um sistema multiempresa é vantagem ter qual dos sistemas? Para databases que ficarão enormes é vantagem usar a escolha 2?
Estou numa empreitada com um projeto de software-livre e opensource e desejo respostas antes de prosseguir.
Como disse sou hobbista tenho poucos trabalhos renumerados neste setor. Logo, conto com a resposta de mais experientes.
Página do projeto: http://codigolivre.org.br/projects/brasillivre/
Obrigado

PS: Irei usar o SC neste rojeto.
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?

jovitomelo

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 916
    • Simples Assim
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #1 Online: Junho 13, 2012, 02:57:56 pm »
Alê,

Seguinte... o grande sucesso de um sistema está na modelagem do seu DB... há situações em que um banco extremamente normalizado seja de grande valia (80% dos casos) isso porque você evita o re-trabalho e consequentemente diminuem-se as chances de erros. Muitos DBA´s defendem essa tese.

Mas nem tudo são flores - normalização excesiva tem um custo muito alto... são muitas requisições ao banco, consequentemente muita memória e muito rocessador... há também que se ter um forte conhecimento em SQL, coisa que a maioria dos desenvolvedores não têm pois são tarefas muito próprias de DBA´s - e, de um modo geral, tudo que é normalizado precisa ser desnormalizado em algum momento. Então o ideal é um meio termo.

Existem situações em que a desnormalização é extremamente necessária - são os casos dos DWs e BIs... e todo sistema bem montado deverá contemplar pelo menos uma dessas ferramentas gerenciais.

Meu conselho: defina corretamente os objetivos do seu sistema, a que ele se propõe, tenha uma correta definição dos estudos de casos. Feito isso escolha o que é melhor... a decisão é sua.

Conheço sistemas que foram muito bem modelados, bastante normalizados e quando entraram em produção o banco não aguentava.

Forte abraço.
Jovito Melo
Maceió - Alagoas

Haroldo

  • Expert
  • *****
  • Mensagens: 6293
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #2 Online: Junho 13, 2012, 02:58:33 pm »
Está aí um assunto que gosto de discutir.

Vamos lá.

Primeiro eu me baseio em normas de modelagem, e a que sigo é  modelagem em banco de dados relacional com base na metodologia defendida por Carlos A. Heuser no livro "Projeto de Bando de Dados".

Costumo usar o brModelo (software livre, impressionantemente pequeno em bytes, desenvolvido por um universitário para defender a tese acima).

Fornecedor é uma entidade, Clientes é outra entidade, só por aí já esta claro que devem ser tabelas diferentes, existem atributos em clientes que não são necessários em fornecedores, assim como contas a pagar e contas a receber pertencem a uma mesma espécia: Títulos, nada impede de ser numa mesma tabela ou não, mas os campos serão os mesmos para os dois tipos, a receber e a pagar, e como fica o relacionamento com fornecedores e clientes caso titulos seja uma única tabela, aí entram as views,  e assim vai.

Usar o BRModelo, e conhecer essa metodologia, faz a diferença na modelagem de um banco de dados.


Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1659
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #3 Online: Junho 13, 2012, 03:05:55 pm »
Obrigado pelas respostas Haroldo e Jovito
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?

Cleyton Euler

  • Expert
  • *****
  • Mensagens: 1149
    • Associação de Usuários Scriptcase
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #4 Online: Junho 13, 2012, 03:13:35 pm »
Alexandre,

Penso que isso é uma questão mais de gosto do que técnica. Eu sempre me via neste tipo de dilema quando estava começando a modelar banco de dados. Com a experiência, aprendi que sempre que você tem duas tabelas que podem ser uma, faça uma. Ou seja, se vc tem duas tabelas com poucos campos que não estão contidos em uma ou outra tabela, prefira fazer uma. Com os SGBDs atuais o tamanho do banco é a capacidade do sistema em que está instalado. Se vai ser multiempresa, é apenas mais um campo na tabela que identifica o registro. Vai fazer pouquíssima diferença.

O que deve ser observado, é o tipo de dados certo para o campo. Se vc tem um dados varchar 30, não deve setar o campo com varchar 255. Outra coisa importante são os índices da tabela.

Uma solução hipotética seria vc fazer uma tabela para os dois casos e criar uma view para cada caso. Numa pesquisa por fornecedor vc consome dados da view fornecedor, se for cliente consome da cliente. Isso se essa tabela for realmente muito grande.
Associação de Usuários Scriptcase
http://www.auscriptcase.com.br

Consultoria Scriptcase Versão 5
http://www.infinitusweb.com.br

Cleyton Euler

  • Expert
  • *****
  • Mensagens: 1149
    • Associação de Usuários Scriptcase
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #5 Online: Junho 13, 2012, 03:35:34 pm »
Está aí um assunto que gosto de discutir.

Vamos lá.

Primeiro eu me baseio em normas de modelagem, e a que sigo é  modelagem em banco de dados relacional com base na metodologia defendida por Carlos A. Heuser no livro "Projeto de Bando de Dados".

Costumo usar o brModelo (software livre, impressionantemente pequeno em bytes, desenvolvido por um universitário para defender a tese acima).

Fornecedor é uma entidade, Clientes é outra entidade, só por aí já esta claro que devem ser tabelas diferentes, existem atributos em clientes que não são necessários em fornecedores, assim como contas a pagar e contas a receber pertencem a uma mesma espécia: Títulos, nada impede de ser numa mesma tabela ou não, mas os campos serão os mesmos para os dois tipos, a receber e a pagar, e como fica o relacionamento com fornecedores e clientes caso titulos seja uma única tabela, aí entram as views,  e assim vai.

Usar o BRModelo, e conhecer essa metodologia, faz a diferença na modelagem de um banco de dados.

Também gosto deste assunto...

Fornecedor é uma entidade e Cliente é outra se assim for desenhado. Se eu tenho uma regra que define que um registro pode ser cliente ou fornecedor é uma questão de escolha criar ou não duas entidades. E como vou tomar a decisão? Baseado na quantidade de atributos diferentes que uma tem em relação a outra e no relacionamento com outras entidades. Colocando na balança, se eu tenho mais atributos iguais do que diferentes, estas duas entidades podem ser uma. Nunca "devem ser" e sempre "podem ser" uma.

Sobre a normalização o Jovito falou pouco mais falou bonito. rsrsrs
Eu só normalizo o que necessariamente tem que ser normalizado. Principalmente se a camada de aplicação for desenvolvida em SC.
Associação de Usuários Scriptcase
http://www.auscriptcase.com.br

Consultoria Scriptcase Versão 5
http://www.infinitusweb.com.br

Haroldo

  • Expert
  • *****
  • Mensagens: 6293
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #6 Online: Junho 13, 2012, 03:47:21 pm »
No meu campo de visão, a normalização deve ser aplicada em 100% da modelagem, mas porque?

Porque não sou detentor do código e único mantenedor dele, eu penso sempre em desenvolver para que qualquer um da minha equipe possa entender e manter, sendo assim, todos da equipe  seguimos uma mesma metodologia e aplicamos 100% dela, para não ficar nada pessoal.

Mas se for apenas você que vai mexer por toda a vida no aplicativo, a forma que adotar só vai interferir em performance e custo em disco, pois o conceito estará em sua própria memória e não terá dificuldade para entender a modelagem depois de meses ou anos da sua criação.

Cleyton Euler

  • Expert
  • *****
  • Mensagens: 1149
    • Associação de Usuários Scriptcase
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #7 Online: Junho 13, 2012, 04:09:41 pm »
A própria normalização é subjetiva. Um pode normalizar de acordo com sua visão, outro pode normalizar diferente. Aplicar normalização em 100% da modelagem não garante que um entenda o projeto do outro. O que garante isso, como vc citou é metodologia, sintonia da equipe e documentação.
Associação de Usuários Scriptcase
http://www.auscriptcase.com.br

Consultoria Scriptcase Versão 5
http://www.infinitusweb.com.br

Haroldo

  • Expert
  • *****
  • Mensagens: 6293
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #8 Online: Junho 13, 2012, 04:26:49 pm »
se a equipe for treinada num mesmo método, o entendimento de como fazer será mais parecido , semelhante do que cada um não usar método algum, e é para isso que normas são criadas, para que se desenvolvam num padrão. Por isso existem os ISOs, ITILs, e diversas outras siglas.

http://sis4.com/brModelo/


Cleyton Euler

  • Expert
  • *****
  • Mensagens: 1149
    • Associação de Usuários Scriptcase
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #9 Online: Junho 13, 2012, 05:02:47 pm »
Normalização neste caso é diretamente ligado ao conceito de relacionamento. Deve ser aplicado conforme o objetivo. É preciso ter mais desempenho no banco ou na aplicação? A normalização deve ser usada respondendo a primeira ou a segunda pergunta e é por isso que existem mais de uma forma normal. Ainda, atualmente trabalhamos até a terceira forma normal, mas na pré-história dos SGBDs existiam formas normais, hoje em desuso. Agora é claro que existem padrões de projeto que devem ser seguidos e se o trabalho é feito em equipe, a equipe define a metodologia e pau na brasa.

Normalização é tão útil quanto desnecessária. Tanto é que a moda agora é banco de dados Non-SQL, banco de dados não relacionais, como por exemplo o MongoDB.

Também uso o brModelo.
Associação de Usuários Scriptcase
http://www.auscriptcase.com.br

Consultoria Scriptcase Versão 5
http://www.infinitusweb.com.br

saulobborges

  • Expert
  • *****
  • Mensagens: 1392
    • SGi Sistemas
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #10 Online: Junho 13, 2012, 05:48:04 pm »
Acho que uma tabela relacional que defina quem é o que mata o assunto.
Acho que como já foi dito, é mais uma questão de gosto e experiência do que de melhor ou pior maneira.

Eu trabalho com desenvolvimento web faz uns 8 anos, focava na parte de programação e não me preocupava muito com banco, ou as melhores práticas de design de banco. Hoje eu vejo que um banco de dados bem elaborado, e mais ainda, elaborado de uma forma fácil de entender economiza cerca de 40% do tempo de desenvolvimento, se não mais que isso!!

O projeto a que me dedico a cerca de 2 anos já teve várias alterações nas tabelas porque encontrei maneiras mais rápidas de fazer determinadas coisas, mas como o Jovito mesmo disse, nesse meio tempo aprendi que a normatização por si só trás mais dores de cabeça para desenvolvedores autônomos como eu do que facilitam a vida.

Haroldo

  • Expert
  • *****
  • Mensagens: 6293
  • Conhecimento diminui limitações.△TFA△
    • Infinitus Web Gestão Empresarial/Gestão ITIL/Consultoria Scriptcase
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #11 Online: Junho 13, 2012, 06:21:33 pm »
Eu comecei em 1980, com cobol de mainframe, não tinha acesso a modelagem, era uma equipe (elitizada) que só mexia com isso, e nós programadores, eramos apenas os extratores de dados, cujo os programas só seriam publicados com a autorização e homologação deles. Com o tempo o programador começou a se tornar analista, e a fazer os dois ao mesmo tempo, hoje temos o conceito de dba, onde um especialista constrói e otimiza as bases. O que vem primeiro é o banco de dados, a aplicação é uma das camadas, então um conjunto de regras para tornar esse banco rápido ao mesmo tempo prático, e com o menor custo de disco possível, é a visão perfeita, mas o equilíbrio entre praticidade e performance deve ser considerado.


Robert Berbert

  • Expert
  • *****
  • Mensagens: 769
  • Desenvolver é sempre estar se atualizando.
    • Conesoft
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #12 Online: Junho 14, 2012, 04:36:45 pm »
Partilho da ideia do Haroldo gostei muito dos argumento levantados por todos nessa discussão, mas a modelagem é essencial, eu sou um programador novo, só tenho 05 anos de experiência, onde 2 foram com sites, e 3 em sistemas web, que é o segmento que trabalho hoje, à 2 anos atras eu comecei a estudar modelagem por conta própria em artigos no livro citado pelo Haroldo, "Projeto de Banco de Dados" nos primeiros posts, e o brModelo é um software incrível eu nunca vi um software tão pequeno capaz de tanta coisa.

Eu deixei de trabalhar como programador php, onde eu só controlava código php de um biblioteca pronta, de uma área pré determinada, e recentemente fui contratado como desenvolvedor e para trabalhar com ScriptCase, eu não tenho nem um mês de ferramenta ainda mas já posso ver que é muito boa, meu primeiro projeto é um Control Center completo baseado no ITIL, e eu acho que se não fosse a modelagem e o TDD, o software não teria a qualidade que se espera de um Control Center.

Concluindo, Fornecer e Clientes na mesma tabela são para os antigos ERPs mal estruturados e que precisam de suporte 24h sem documentação.... grrrr que me da um nervosoooo.


Bom essa é a minha opnião.
-- Design ou programador eis a questão.

jovitomelo

  • Global Moderator
  • Expert
  • *****
  • Mensagens: 916
    • Simples Assim
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #13 Online: Junho 14, 2012, 11:24:19 pm »
Pessoal,

Esse é um tema realmente muito gostoso...
Eu entendo que o que discutimos aqui são as melhores práticas, pq a concepção de certo ou errado praticamente não existe.... e pra enriquecer um pouco mais a discussão....

Embora conheça o "Projeto de Bando de Dados" (é como uma bíblia no meio acadêmico) eu não uso o brModelo, mas já que vcs falaram tão bem eu vou dar umas mexidas...

Acho que eu e o SDHPU somos os vovôs desse pessoal aqui... e nessas andanças observei algumas coisas:

a) Muitos desenvolvedores não têm conhecimento de modelagem (alguns sequer conhecem realmente o SGDBs que tem nas mãos) ... alguns fazem alguma coisa, mas tudo muito empírico, sem conhecimento de causa, sem estudo... vê os outros fazendo e fazem e funciona... (pode não ser da melhor forma, mas funciona).

b) A quase totalidade dos desenvolvedores não documentam patavina de nada. Esse é um grande problema... muitos tem alguma dificuldade com relação a isso, porque não conseguem concatenar direito as idéias.

Entendo que a modelagem é uma decisão de projeto... cada projeto tem as suas particularidades. Como eu ando em vôo solo, toda modelagem minha estabelece um determinado padrão... o que nem sempre é bom.

Em uma equipe de desenvolvimento a figura do DBA acho que seja fundamental importância, porque a administração do DB é algo simplesmente fantástico.

Abraço a todos.
Jovito Melo
Maceió - Alagoas

Alexandre Pereira Bühler

  • Expert
  • *****
  • Mensagens: 1659
  • Nunca estabeleça um teto para os seus rendimentos.
    • Simão & Bühler Ltda
    • Email
Re:Uma única tabela para cliente, fornecedor etc ou uma tabela para cada?
« Responder #14 Online: Junho 15, 2012, 02:58:19 am »
Nunca pensei que este tópico tivesse respostas tão enriquecedoras.
Obrigado por compartilhar a experiência de vocês.
--
Alexandre Pereira Bühler
https://www.simaoebuhler.com.br
Hospedagem compartilhada Scriptcase desenvolvimento e produção. Temos servidores dedicados Scriptcase.
Eu RTFM todo dia e você?