Esse artigo faz parte da revista SQL Magazine edição 57. Clique aqui para ler todos os artigos desta edição

cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left" align=left>No âmbito das linguagens de programação OO, a herança é uma técnica bastante utilizada, principalmente se falarmos de linguagens como o Java ou C++ que são fortemente orientadas a objetos.

Saindo do mundo das linguagens e entrando no mundo dos bancos de dados, nos deparamos com uma realidade totalmente diferente, onde estes conceitos são diluídos e utilizadas idéias similares, como a especialização, que tem um pouco de semelhança com a herança de objetos.

Mas aí podemos pensar “Como era bom trabalhar com objetos” ou “Será que o banco que trabalho tem suporte à OO?”. Alguns bancos objeto-relacionais comerciais, como o Oracle, e de código aberto, como o PostgreSQL, possuem módulos nativos para se trabalhar com orientação a objetos.

Este artigo apresentará como o PostgreSQL implementa a herança de tabelas, um dos conceitos da orientação à objetos. Para tanto, serão discutidos os conceitos gerais de herança de objetos e como estes conceitos se enquadram dentro do PostgreSQL. Serão mostrados também pequenos exemplos de implementação para demonstrar o uso da herança e mostradas algumas dicas e limitações no uso da mesma. A versão do PostgreSQL utilizada neste artigo foi a 8.2.6.

 

Conceitos gerais sobre herança

A herança é muito utilizada nas linguagens de programação orientadas a objetos. É um conceito que permite alto grau de reutilização de código, quando bem utilizado.

Com esta técnica, as características comuns a diversos objetos podem ser concentradas em um objeto pai, criado por uma superclasse. A partir desse objeto, outros podem ser derivados, onde a classe que cria os mesmos, ou subclasse, herda as características da superclasse. Cada um desses objetos derivados apresenta as características (estrutura e métodos) do objeto pai e acrescenta a eles o que for particular ou específico de cada um. A idéia é fornecer um mecanismo simples, mas eficiente, para que se definam novos objetos a partir de um já criado.

A Tabela 1 mostra alguns exemplos onde se pode utilizar o mecanismo de herança. Mas, independentemente do exemplo dado, é preciso ter em mente que o objeto pai tem características gerais e o objeto derivado tem características especificas.

 

Superclasse

Subclasse

Membro

Presidente, Diretor, Empregado, Associado

Empregado

Servente, Secretária

FormaGeométrica

Círculo, Quadrado, Triangulo

Tabela 1. Exemplos de herança

 

Conceitos de herança no PostgreSQL

Seguindo os conceitos da herança de objetos, o PostgreSQL implementa a herança de tabelas, que pode ser uma ferramenta útil para os administradores de dados.

A partir do padrão SQL:1999 foram definidas características de herança de tipos e tabelas que diferem em alguns aspectos das características implementadas pelo PostgreSQL, como a herança múltipla, exemplificada mais adiante.

Para ficar mais fácil o entendimento, vamos trabalhar em cima de um exemplo simples de um modelo de dados para um sistema acadêmico. Neste exemplo, temos turmas com alunos matriculados que podem trabalhar como monitores, ou seja, tiram dúvidas e ajudam outros alunos da turma. Suponhamos que quiséssemos saber quais os alunos são monitores de cada turma. Poderíamos resolver esta pergunta de três maneiras clássicas. Criando duas tabelas, uma específica para alunos e outra para monitores, como na Figura 1, ou ter apenas a tabela de alunos com um campo dizendo se é ou não monitor (utilizando o campo in_monitor), como na Figura 2, ou especializando a tabela de alunos, como na Figura 3.

 

Figura 1. Divisão da tabela de aluno

 

Figura 2. Especificação de uma coluna indicativa extra (in_monitor)

 

Figura 3. Especialização da tabela de aluno

 

Agora, vamos resolver esta situação utilizando a herança de tabelas do PostgreSQL. Conceitualmente falando, quando utilizamos esta técnica, o modelo de dados se assemelha a uma especialização, como mostrado na Figura 3. Na Listagem 1 temos o código para a criação das mesmas.

 

Listagem 1. Criação das tabelas

 

CREATE TABLE tb_turma (

  id_turma int4 NOT NULL, -- identificador da turma

  CONSTRAINT tb_turma_pkey PRIMARY KEY (id_turma)

);

...

Quer ler esse conteúdo completo? Tenha acesso completo