ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Uma tabela para cada cadastro ou tabela única para todos?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  

Uma tabela para cada cadastro ou tabela única para todos (Cliente, Funcionário e Fornecedor)?
Primeira Opção
100%
 100%  [ 4 ]
Segunda Opção
0%
 0%  [ 0 ]
Total de Votos : 4

Autor Mensagem
raibarros
Novato
Novato


Registrado: Terça-Feira, 26 de Mai de 2009
Mensagens: 5

MensagemEnviada: Ter Mai 26, 2009 10:54 pm    Assunto: Uma tabela para cada cadastro ou tabela única para todos? Responder com Citação

Olá, caros amigos! A minha pergunta é relativamente simples e peço a ajuda de todos. Na modelagem de banco de dados, qual das duas soluções é a mais viável:

1 - gerar uma única tabela para o cadastro de cliente, funcionário e fornecedor, criando também um campo para especificar o seu tipo;

2 - criar uma tabela para cada, como é usado de forma mais comum nos softwares?

Agradeço a ajuda!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qua Mai 27, 2009 11:04 am    Assunto: Responder com Citação

Bom se é mais viável pra você eu não sei, mas pra mim seria mesclar as duas opções. Quando possível eu prefiro utilizar o conceito de "generalização/especialização".

Citação:
Neste seu caso eu fazeria o seguinte:

1 - Depois de realizado o esboço inicial (identificação do problema) e logo em seguida o levantamento dos requisitos. Identifico todos os atributos (caracteristicas de uma entidade) e a entidade que representa estes atributos.

2 - Identifico todos os atributos que sejam comum para todas as entidades e desloco para a uma nova entidade que assumira o papel de entidade pai (generalização) e o restante das entidades que possuim suas caracteristicas especificas da própria entidade assumiria o papel de entidade filha (especialização).
ex.: todas as pessoas (cliente, funcionário, fornecedor....) tem nome, endereço, telefone, etc.

3 - Um básico exemplo para ilustrar o conceito:
Pessoa (id_pessoa, nome, endereço, telefone) - id_pessoa chave primaria.
Cliente (id_pessoa, limeteCredito, horarioFuncionamento) - id_pessoa chave primaria e referência a tabela Pessoa.
Funcionário (id_pessoa, cargo, departamento, funcionarioSupervisor) - id_pessoa chave primaria e referência a tabela Pessoa.
Fornecedor (id_pessoa, horarioFuncionamento, ramoAtividade) - id_pessoa chave primaria e referência a tabela Pessoa.


Observe que a entidade Pessoa (assumindo o papel de entidade generalizada (generalização)) possui os atributos que é comum para as entidades Cliente, Funcionario e Fornecedor (que se identifica como entidade especializadas (especialização)).

Sempre que possível eu utilizo este conceito de generalização/especialização porque neste caso você reduz a possíbilidade de haver uma inconsistência de dados no seu banco. Explico: se você não utiliza este conceito e for criando as tabelas sem pensar como será a estrutura dos dados (armazenamento do dados), como na sua segunda opção, pode haver dados "diferente" de uma mesma pessoa entres as tabelas, porque no mundo real é possível que um cliente ou funcionario pode se tornar tambem um fornecedor ou um fornecedor que tambem é o seu cliente e nestes casos imagine quando você precisa atualizar um endereço ou um telefone...? se você atualizar os dados na tabela de cliente e esquecer de atualizar na tabela de fornecedor, o que vai acontecer? a mesma pessoa tem seus dados "diferentes" nas tabelas de cliente e fornecedor, ou seja, você tem uma inconsistência de dados.

Acredito que se você utiliza somente a segunda opção, você precisa criar uma lógica no sistema que faça a checagem de quando um usuario for cadastrar um cliente verificar se o mesmo código exista nas tabelas de fornecedor, funcionario em todas as tabelas de pessoa e tambem fazer esta alteração nestas tabelas, mas eu prefiro utilizar o próprio recurso que os bancos SGBD trazem a muito tempo (generalização/especialização).

Esta é a minha linha de raciocinio, não quer dizer que é a forma correta de se fazer ou a mais viavel, é somente a minha forma de se pensar!

Agora a questão da enquete eu não assinalei nenhuma opção porque não há um meio termo ai. Very Happy
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.


Editado pela última vez por pestana em Ter Jun 02, 2009 10:45 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Qua Mai 27, 2009 11:16 am    Assunto: Responder com Citação

Citação:
Esta é a minha linha de raciocinio, não quer dizer que é a forma correta de se fazer ou a mais viavel, é somente a minha forma de se pensar!


mas é a forma mais correta! na teoria pelo menos.

O grande problema é o design da coisa, porque vc pode acabar se perdendo na propria "ideologia" do negocio. Fica meio parecido com modelagem de OO. Enfim, é facil exagerar e se perder.

E pra quem tem medo de joins, não é bom também (tem gente que morre de medo de joins).
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
raibarros
Novato
Novato


Registrado: Terça-Feira, 26 de Mai de 2009
Mensagens: 5

MensagemEnviada: Qua Mai 27, 2009 11:32 pm    Assunto: Observações pertinentes. Responder com Citação

Caros amigos. São pertinentes as respostas, sem dúvida. Mas daí surge ainda outra pergunta: no modelo intermediário, caso uma mesma pessoa seja funcionário e fornecedor ao mesmo tempo, dentro da organização, ainda assim não haveria a necessidade de cadastrá-los duas vezes (a primeira na entidade funcionário e a segunda na entidade fornecedor)? Continuaria havendo redundância de dados, estou correto?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Sex Mai 29, 2009 2:22 pm    Assunto: Responder com Citação

DonOctavioDelFlores escreveu:
O grande problema é o design da coisa, porque vc pode acabar se perdendo na propria "ideologia" do negocio. Fica meio parecido com modelagem de OO. Enfim, é facil exagerar e se perder.


tem razão! se não entender direito o conceito e exagerar na criação das tabelas (que não se torna forte candidata) é arriscado de se perder na ideologia do negocio.

raibarros escreveu:
caso uma mesma pessoa seja funcionário e fornecedor ao mesmo tempo, dentro da organização, ainda assim não haveria a necessidade de cadastrá-los duas vezes (a primeira na entidade funcionário e a segunda na entidade fornecedor)?


Dados que são comuns para todos não! ou seja, os dados que estão cadastrados na tabela "Pessoa". O que você tem que cadastrar duas vezes são os dados "especificos" de funcionario e fornecedor, mas cada um em suas tabelas.

E antes de você querer cadastrar o funcionário e o fornecedor, obrigatoriamente este registro tem que estar cadastrado na tabela Pessoa. Seguindo o exemplo: As tabelas Funcionario e Fornecedor possuem a chave primaria que tambem é chave estrangeira do campo id_pessoa na tabela Pessoa, então por isso que eu digo que é necessariamente obrigado primeiro "cadastras os dados referente a pessoa" e com este código da pessoa você informa ao fazer o cadastro de funcionario e fornecedor. Você não vai adicionar todos os campos que se diz respeito a pessoa na tabela de funcionario e fornecedor.
ex.:

Pessoa
id_pessoa | nome | dtNascimento
01 | jose | 11/11/1111
02 | maria | 22/22/2222
03 | joão | 33/33/3333
id_pessoa: chave primária.

Funcionario
id_pessoa | id_cargo | id_depto | supervisor
01 | 01 | 02 | null
02 | 02 | 01 | null
03 | 01 | 02 | 01
id_pessoa: chave primária e chave estrangeira que referência o campo id_pessoa da tabela Pessoa.
id_cargo: chave estrangeira que referência o campo id_cargo da tabela Cargo.
id_depto: chave estrangeira que referência o campo id_depto da tabela Departamento.

Fornecedor
id_pessoa | ramoAtividade
03 | informatica
id_pessoa: chave primária e chave estrangeira que referência o campo id_pessoa da tabela Pessoa

Cargo
id_cargo | nome
01 | programador
02 | analista de sistemas
03 | engenheiro de software

Departamento
id_depto | nome
01 | suporte
02 | CPD
03 | administrativo


Observe que somente o "campo que identifica o registro" se repete nas tabelas Funcionario e Fornecedor e não os dados de outros campos pertencentes da tabela Pessoa. Por isso que a resposta para a sua dúvida é negativa.

entendeu? qualquer coisa de um grito ai!
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
raibarros
Novato
Novato


Registrado: Terça-Feira, 26 de Mai de 2009
Mensagens: 5

MensagemEnviada: Seg Jun 01, 2009 10:24 pm    Assunto: Agradeço as opiniões! Responder com Citação

Caros amigos! Embora concorde em quase a totalidade do que foi exposto pelo 'pestana', sabemos que ainda haverá redundância de dados (reconhecendo que os principais dados não serão replicados). Agradeço muito a participação de vocês e tenham certeza que os comentários foram muito elucidativos! Obrigado!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Ter Jun 02, 2009 10:42 am    Assunto: Responder com Citação

boa dia raibarros!

Gostaria de entender o que você citou:

Citação:
sabemos que ainda haverá redundância de dados (reconhecendo que os principais dados não serão replicados).


De que maneira pode haver redundância?
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
raibarros
Novato
Novato


Registrado: Terça-Feira, 26 de Mai de 2009
Mensagens: 5

MensagemEnviada: Sáb Jun 06, 2009 5:59 pm    Assunto: Caro Pestana! Entendi a sua explicação! Responder com Citação

Estou testando na prática nesse momento e, de fato, parece ser uma boa solução! Você tem razão: não há redundância! Mas o que pode ocorrer é a utilização em demasia de subconsultas dentro da própria tabela. Ex.: quando é necessário, em uma pesquisa, listar o cliente e o funcionário que cadastrou o cliente (ambos estão na mesma tabela). Ou ainda podem existir casos mais complexos: Listar todas as movimentações financeiras de uma pessoa, sendo ela "cliente" e "fornecedor" ao mesmo tempo, além da pesquisa (na mesma select) do funcionário que realizou o cadastramento de cada tupla.

Aguardarei resposta!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB