KingHost
Canais iMasters

Banco de Dados + SQL Server + PostgreSQL + MySQL + Oracle + UML

Modelagem de Dados - Parte 06 (Generalizações / Especializações)

Caros colegas. Estive ausente da coluna nesses 3 meses por motivos profissionais, mas aqui estou, e darei continuidade à série sobre Modelagem.

No artigo anterior vimos como traduzir os relacionamentos. Para concluir essa etapa, vamos às recomendações:

  • Tradução de relacionamentos é orientada sempre pela cardinalidade mínima.
  • Se houverem relacionamentos 1:1, verifique se não é melhor fundir as 2 tabelas em uma única.
  • A chave primária é colocada sempre na tabela que corresponde ao lado N do relacionamento 1:N.
  • Relacionamentos N:N sempre geram uma terceira, com as chaves primárias das 2 tabelas originais.
  • Se necessário, escreva o esquema relacional do seu banco de dados, antes de gerar suas tabelas.

A tradução de generalizações/especializações tem alguns aspectos particulares que devemos analisar.

Primeiramente vamos supor uma entidade com especializações:

Entidade: Pessoa - Atributos: Código, Nome, Endereço e Telefone

Entidade: Pessoa Fisica - Atributos: Todos os atributos de Pessoa, CPF, RG

Entidade: Pessoa Jurífica - Atributos: Todos os atributos de Pessoa, CNPJ, IE, Razão Social

As entidades Pessoa Física e Jurídica são especializações da entidade Pessoa. Como representar isso no banco de dados?

Bem, nesse caso temos 2 alternativas:

1) Criar uma única tabela para todas as especializações e incluir um campo diferenciador: Seria juntar todos os tipos de Pessoa, em uma única tabela e acrescentar mais um campo para identificar a Pessoa. Exemplo:

Pessoa: Código, TipoDePessoa, Nome, Endereço, Telefone, CPF, RG, CNPJ, IE, RazaoSocial

2) Criar uma tabela para cada especialização e definir mais um campo identificador

Pessoa: Código, Nome, Endereço, Telefone

Pessoa_Fisica: CodPessoa, CPF, RG

Pessoa_Juridica: CodPessoa, CNPJ, IE, RazaoSocial

A vantagem da primeira alternativa é que não precisaremos fazer junções da tabela generalizada (Pessoa) com a tabela especializada (Pessoa Física ou Jurídica) quando precisarmos de informações específicas. Outra vantagem é que a chave primária da tabela Pessoa fica armazenada somente 1 vez no banco de dados. A desvantagem é que, ao fazermos uma consulta no banco de dados, a linha inteira (todos os campos) são carregados na memória, mas sabemos que haverão campos em branco, dependendo do tipo de Pessoa cadastrada.

Na segunda alternativa, há a necessidade de fazer junções quando formos obter todas as informações de uma Pessoa. Porém, a vantagem é que teremos somente os dados necessários sem a necessidade de carregar todos os campos na memória, gerando mais acessos ao banco de dados. As chaves primárias de Pessoa são repetidas nas tabelas especializadas e, quando houver atualização das informações de uma pessoa, haverá a necessidade de criar uma instrução para cada tabela especializada.

A escolha de um dos tipos de tradução para generalizações/especializações irá depender do projeto que está sendo construído e dos recursos disponíveis para quem está modelando. Nada impede que as duas alternativas sejam usadas no mesmo projeto de banco de dados, uma alternativa pra cada caso de tabelas generalizadas.

Concluídas as etapas de tradução entre modelos, temos o banco de dados formado, com suas tabelas, campos e relacionamentos.

No próximo artigo falarei sobre como refinar o seu modelo relacional e também sobre a Normalização do seu banco de dados.

Observações:

Nesta série de artigos, eu faço uma análise de alto nível sobre a Modelagem de Dados sem aprofundar-me nos processos de modelagem. Se for do seu interesse, vale a pena pesquisar o conteúdo específico sobre cada etapa que descrevi nessa série.

Se você me enviou e-mails e não obteve resposta, peço a gentileza de reenviar. Faço questão de responder a todas as mensagens, apesar do pouco tempo hábil.

Até a próxima!


Comente também

6 Comentários

welington souza figueiredo
welington souza figueiredo

De todos os artigos que já andei lendo por ai, esse foi o mais explicativo de todos, pois a forma que o Mauri utiliza para explicar os conceitos são se duvida nenhuma os mais compreensíveis possível.

Marcel Franco de Oliveira
Marcel Franco de Oliveira

o texto está realmente muito bem explicado. Parabéns

Vinnie Pozzebon
Vinnie Pozzebon

Seria completamente POG a primeira tabela...

Samuel O. G. Santos
Samuel O. G. Santos

Gostei do artigo foi bem explicativo. Parabéns.

Bruno Rodrigues
Bruno Rodrigues

Mais uma texto muito bem redigido e explicado, muitas pessoas acham que o BD se dá somente na sua criação quando na verdade esses conceitos podem fazer muita diferença e até facilitar nossa vida

Tiago Cunha
Tiago Cunha

Muito boa suas colocações e análises para as escolhas de relacionamento da tabela Pessoa. Gostaria de contribuir para essa análise e sugerir uma terceira opção e obter sua opinião.
Se optarmos por gerar uma única tabela (opção I) e criarmos duas views, uma para Pessoa Física e outra para pessoa jurídica, já efetuando os filtros para que cada view retorne somente os dados relevantes.
Seria essa uma maneira de contornar as vatagens e desvantagens das opções I e II e não criarmos outras desvantagens com a opção III ?
Parabéns pelos artigos publicados.
Um abraço.

Qual a sua opinião?

Comentários considerados ofensivos serão moderados.
KingHost

Parceiros

IBM
PagSeguro
Internet Innovation
Dialhost
HostNet
Tecla
KingHost
DotStore
Dinamize