3.5. Herança

Herança é um conceito de banco de dados orientado a objeto, que abre novas possibilidades interessantes ao projeto de banco de dados.

Vamos criar duas tabelas: a tabela cidades e a tabela capitais. Como é natural, as capitais também são cidades e, portanto, deve existir alguma maneira para mostrar implicitamente as capitais quando todas as cidades são mostradas. Se formos bastante perspicazes, poderemos criar um esquema como este:

CREATE TABLE capitais (
  nome       text,
  populacao  real,
  altitude   int,    -- (em pés)
  estado     char(2)
);

CREATE TABLE interior (
  nome       text,
  populacao  real,
  altitude   int     -- (em pés)
);

CREATE VIEW cidades AS
  SELECT nome, populacao, altitude FROM capitais
    UNION
  SELECT nome, populacao, altitude FROM interior;

Este esquema funciona bem para as consultas, mas não é bom quando é necessário atualizar várias linhas, entre outras coisas.

Esta é uma solução melhor:

CREATE TABLE cidades (
  nome       text,
  populacao  real,
  altitude   int     -- (em pés)
);

CREATE TABLE capitais (
  estado      char(2)
) INHERITS (cidades);

Neste caso, as linhas da tabela capitais herdam todas as colunas (nome, populacao e altitude) da sua tabela ancestral cidades. O tipo da coluna nome é text, um tipo nativo do PostgreSQL para cadeias de caracteres de tamanho variável. As capitais dos estados possuem uma coluna a mais chamada estado, que armazena a sigla do estado. No PostgreSQL uma tabela pode herdar de nenhuma, de uma, ou de várias tabelas.

Por exemplo, a consulta abaixo retorna os nomes de todas as cidades, incluindo as capitais dos estados, localizadas a uma altitude superior a 500 pés:

SELECT nome, altitude
  FROM cidades
  WHERE altitude > 500;

   nome    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
 Madison   |      845
(3 linhas)

Por outro lado, a consulta abaixo retorna todas as cidades que não são capitais de estado e estão situadas a uma altitude superior a 500 pés:

SELECT nome, altitude
    FROM ONLY cidades
    WHERE altitude > 500;

   nome    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
(2 linhas)

Na consulta acima a palavra chave ONLY antes de cidades indica que a consulta deve ser efetuada apenas na tabela cidades, sem incluir as tabelas abaixo de cidades na hierarquia de herança. Muitos comandos mostrados até agora — SELECT, UPDATE e DELETE — permitem usar a notação ONLY.

Nota: Embora a hierarquia seja útil com freqüência, sua utilidade é limitada porque não está integrada com as restrições de unicidade e de chave estrangeira. Para obter mais detalhes deve ser consultada a Seção 5.8.

SourceForge.net Logo CSS válido!