Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Allyson de Paula

Melhores práticas - entidade relacionamento

Recommended Posts

Senhores, este é meu primeiro post e venho compartilhar uma questão comum a muitos - imaginem a seguinte SELECT:

SELECT
    P.id,
    P.nomeEmpresarial,
    P.natureza,
    J.nomeFantasia,
    J.cnpj,
    F.cpf
    E.cep,
    E.logradouro,
    E.numero,
    E.bairro,
    E.cidade,
    E.uf
FROM
    Pessoa as P

LEFT JOIN
    PessoaJuridica as J ON J.pessoa = P.id AND P.natureza = 'J'

LEFT JOIN
    PessoaFisica as F ON F.pessoa = P.id AND P.natureza = 'J'

LEFT JOIN
    Endereco as E ON E.pessoa = P.id AND E.enderecoLegal IS NOT NULL

 

 

 

A SELECT acima possui um fator de "manutenção" relativamente alto pelos seguintes fatores:
  • CREATE - Quando se vai criar um registro de Pessoa, consequentemente baseado na FLAG natureza (F ou J) deve-se criar PessoaFisica ou PessoaJuridica como especialização de Pessoa.
  • READ - Fazer um JOIN condicionado à natureza, isto é, deve-se evitar que no caso de uma exclusão lógica de uma especialização - como no exemplo do UPDATE abaixo - somente os dados da especialização coerente deve ser retornado.
  • UPDATE - Quando se efetua um update é necessário testar se a especialização existe. Isto porque um registro poderia originalmente ter sido criado como Natureza = F (Pessoa Física) e posteriormente querer atualizá-lo para Pessoa Jurídica. No create original um INSERT para PessoaFisica foi efetuado, e agora com a troca de naturezas é necessário excluir logicamente ou fisicamente o registro da pessa Física e então recriar o registro de Pessoa Jurídica.
  • DELETE - SEM maiores complexidades.

 

 

Imaginando toda esta complexidade também é necessário pensar que o mesmo sistema que faz isso no MySQL, fará o mesmo no Postgre e Oracle.

 

Quais seriam as boas práticas que podemos adotar neste cenário? Manutenção dos dados com auxílio de triggers para os 3 bancos? Lógica do CRUD com os devidos tratamentos implementado via aplicação?

 

Desde já agradeço ao tempo de vocês.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em Oracle poderia ser usar uma VIEW e a manutenção programa via uma INSTEND OF TRIGGER.

 

Pessoalmente não gosto muito desta modelagem física em BD pois acho que ela complica as operações, como tudo em TI é o eterno dilema do "cobertor curto", toda solução tem prós e contras.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não consegui editar o post original, há um erro de digitação:

 

LEFT JOIN
    PessoaJuridica as J ON J.pessoa = P.id AND P.natureza = 'J'

LEFT JOIN
    PessoaFisica as F ON F.pessoa = P.id AND P.natureza = 'F' # No exemplo estava 'J'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria um select com um join para a PJ e outro select para a PF, com UNION, opção pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.