GO
Duvidas em Mapeamento objeto relacional classe Pessoa
Fechado
Olá amigos, boa noite!
Estou caminhando na orientação a objetos e tenho uma dúvida com relação ao mapeamento de alguns dados para o modelo relacional. A minha principal dúvida no momento é sobre a classe pessoa que por herança servirá de base para outras classes como a cliente que também servirá de base para a cliente pessoa física e jurídica, nesse caso, terei campos como o CPF e o CNPJ o RG e a IE, enfim, creio que essa situação não seja nova para a maioria dos amigos. Minha dúvida é com relação a melhor forma de mapear esses campos, hoje em meus sistemas eu crio um artifício de tela e armazeno a CPF e o CNPJ no mesmo campo na tabela no banco de dados, isso me facilita para a confecção dos relatórios e das pesquisas, mas tenho dúvidas se essa é a melhor forma de proceder.
Uma outra questão seria sobre um problema comum que me ocorre no sistema atual e que me acaba gerando uma redundância de dados. Um funcionário deseja realizar uma compra na loja e então preciso cadastra-lo na base de clientes, um caso semelhante seria o de um cliente de software passar a fornecer algum material para a empresa e então precisamos fazer um cadastro do mesmo na base de fornecedores.
Seria possível resolver esse caso com uma agregação entre a classe pessoa e uma classe de atribuições?
Exemplo:
Uma pessoa pode ser ao mesmo tempo cliente, fornecedor e funcionário?
Me desculpe pelo pouco conhecimento e já agradeço a quem possa me dar um retorno sobre como proceder da melhor forma.
Abraço e ótima noite!
Estou caminhando na orientação a objetos e tenho uma dúvida com relação ao mapeamento de alguns dados para o modelo relacional. A minha principal dúvida no momento é sobre a classe pessoa que por herança servirá de base para outras classes como a cliente que também servirá de base para a cliente pessoa física e jurídica, nesse caso, terei campos como o CPF e o CNPJ o RG e a IE, enfim, creio que essa situação não seja nova para a maioria dos amigos. Minha dúvida é com relação a melhor forma de mapear esses campos, hoje em meus sistemas eu crio um artifício de tela e armazeno a CPF e o CNPJ no mesmo campo na tabela no banco de dados, isso me facilita para a confecção dos relatórios e das pesquisas, mas tenho dúvidas se essa é a melhor forma de proceder.
Uma outra questão seria sobre um problema comum que me ocorre no sistema atual e que me acaba gerando uma redundância de dados. Um funcionário deseja realizar uma compra na loja e então preciso cadastra-lo na base de clientes, um caso semelhante seria o de um cliente de software passar a fornecer algum material para a empresa e então precisamos fazer um cadastro do mesmo na base de fornecedores.
Seria possível resolver esse caso com uma agregação entre a classe pessoa e uma classe de atribuições?
Exemplo:
Uma pessoa pode ser ao mesmo tempo cliente, fornecedor e funcionário?
Me desculpe pelo pouco conhecimento e já agradeço a quem possa me dar um retorno sobre como proceder da melhor forma.
Abraço e ótima noite!
bem Geovani Oliveira eu uso uma class para dada um desses itens, mas nada impessa que trabalhe com nivel usando associação, ficaria mais organizado e iria suprir sua nescessidade
Oi Geovani,
Eu particularmente prefiro criar um campo genérico (Ex: documento) e validar na aplicação. Além disso, também prefiro usar uma classe Pessoa, sendo que pessoa pode ser sim ora cliente, e ora fornecedor. Não vale a pena quebrar em coisas separadas, pois gera redundância. Prefiro criar uma outra tabela chamada Grupo , onde lá você cadastra os grupos (cliente, fornecedor, funcionário, etc), e faz uma agregação de Pessoa com Grupo (algo como um checkgroup). Assim, Pessoas marcadas como cliente poderão participar de vendas, e marcadas como fornecedor de compras, e de ambos caso estejam marcados como cliente e fornecedor. Deixe a aplicação validar ;-)
Espero ter ajudado.
Att,
Pablo
Olá Pablo, bom dia!
E no caso da pessoa jurídica ou física, também cria somente uma classe e deixa a aplicação controlar?
Exemplo 1 : Pessoa -> Cliente->ClientePF
Pessoa -> Cliente->ClientePJ
Pessoa -> Funcionario
Pessoa -> Fornecedor
Exemplo 2 : Pessoa->PessoaF + (agregação com grupo de pessoas)
Pessoa->PessoaJ + (agregação com grupo de pessoas)
Exemplo 3: Pessoa + (agregação com grupo de pessoas)
Qual seria a situação que você trabalha Pablo?
Abraços!
Seguinte... não existe uma maneira certa de fazer. Existe sim, estratégias de fazer o mapeamento relacional.
Eu recomendo ler a documentação de frameworks como:
- Hibernate caso conheça java;
- NHibernate caso conheça o C#;
- Caso queira permanecer no PHP dê uma olhada no doctrine e no propel.
Conhecendo as técnicas de mapeamento, você vai esbarrar em técnicas que permitem utilizar uma única tabela para classes filhas e neste caso geralmente utiliza-se um campo identificador, ou você pode adicionar cada classe em uma tabela diferente. Abaixo, vou demostrar como utilizar as duas formas utilizando o Adianti Framework:
Técnica que utiliza uma única tabela:
Caso você opte por essa técnica e manipule coleções através do TRepository, a diferenciação dos objetos terá que ser feita no TCriteria. Por exemplo, se for buscar objetos to tipo Pessoa Juridica você terá que retornar todos os objetos cujo cnpj é diferente de nulo.
Técnica que utiliza uma tabela para cada classe (padrão Adianti):
Nessa técnica o único cuidado que você deverá tomar é o de manipular corretamente a persistência de Pessoa juntamente com a PessoaFisica ou PessoaJuridica. Sendo assim, não existe uma maneira melhor ou pior, pois vai depender da sua preferência. A maior vantagem dessa técnica é que as tabelas do banco de dados ficam menos "esburacadas". Porém, você terá que fazer um número maior de consultas.
Então são essas as minhas sugestões. Espero ter ajudado. Abraço!
Olá Guilherme, bom dia!
Agradeço muito pelo retorno, suas explicações e as do Pablo foram de suma importância para o meu aprendizado.
Abração!