Dicas do OsmarJr

Criando sub classes de entidades


Quando criamos um modelo de dados, muitas vezes temos que tratar de diferentes tipos da mesma entidade básica. Como trabalhar com uma tabela principal e diversas tabelas subsidiárias?

Autor: Rebecca Riordan

Quando criamos um modelo de dados, muitas vezes temos que tratar de diferentes tipos da mesma entidade básica. Por exemplo, Clientes pode ser Pessoas Físicas ou Jurídicas e precisamos armazenar diferentes informações para cada um dos tipos. Produtos muitas vezes têm diferentes tipos e não precisamos manter as mesmas informações sobre um livro e um aplicativo. livros podem ter os atributos Título, um ou mais Autores, um Editor, uma Data de Publicação, um Preço de Lista e um Preço de Venda. O aplicativo, por outro lado, tem um Número de Versão, mas não Autores e, provavelmente, não há preocupação com a Data de Publicação.

Uma solução para este problema é incluir todos os atributos de todos os tipos em uma única tabela. Numa primeira olhada esta parece ser uma solução simples e direta. Mas isso é desmontado facilmente à medida que o sistema inclui tipos adicionais, com campos adicionais. Além disso, a interface com o usuário tende a ficar bem complicada rapidamente.

Uma solução melhor é emprestar uma técnica do design orientado a objetos e criar subclasses das entidades. Em termos relacionais, criamos múltiplas tabelas: uma tabela mestre, que contém os campos comuns a todos os tipos, e tabelas subsidiárias que contém as informações específicas para cada tipo.

   Download OneToOne.zip

O banco de dados de exemplo fornece um modelo de como implementar a solução. A entidade primária é Pessoa, que pode ser Física ou Jurídica. A entidade Pessoa contém os campos comuns a todos os tipos, enquanto que as duas tabelas subsidiárias contém apenas as informações específicas dos tipos por elas modelados. (A tabela TipoDePessoa é usada apenas para popular uma caixa de combinação no formulário de exemplo).

Note-se que a chave primária (usei um campo Autonumeração no exemplo) é criada na tabela Pessoas, não nas tabelas subsidiárias. Este é um erro comum e torna a programação mais complexa do que necessário. Não há necessidade dos tipos terem identificadores adicionais e, na verdade, a vida fica mais simples se não tiverem.

O formulário de exemplo, também chamado Pessoas, apresenta uma forma de tratar da interface com o usuário. Temos dois subformulários sobrepostos, um para cada tipo. Quando o usuário seleciona um tipo na caixa de combinação IdTipoPessoa, o formulário apropriado se torna visível. No exemplo isto acontece no evento Ao Sair da caixa de combinação. Este código é repetido no evento No Atual do formulário, de modo a apresentar o subformulário apropriado quando o usuário se move pelos registros.

A consulta AllInOne demonstra a junção de todas as tabelas com o uso de left outer joins. Normalmente não é necessário o uso de tabelas "sacos de gatos" como esta, mas pode ser útil em situações onde não queira usar subformulários ou subrelatórios.

 

Home

Contato | Copyright©Osmar José Correia Júnior | 24-Nov-2005 18:23