3.6. Herança #

Herança é um conceito de banco de dados orientado a objetos. Abre novas possibilidades interessantes no projeto de banco de dados.

Vamos criar duas tabelas: A tabela cidades e a tabela capitais. Naturalmente, as capitais também são cidades, então se deseja, de alguma maneira, mostrar as capitais implicitamente quando listar todas as cidades. Caso você seja realmente esperto, poderá inventar algum esquema como esse:

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

CREATE TABLE nao_capitais (
  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 nao_capitais;

Isso funciona bem no que diz respeito às consultas, mas, por outro lado, a coisa fica feia quando é necessário atualizar várias linhas.

Uma solução melhor seria essa:

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

CREATE TABLE capitais (
    estado      char(2) UNIQUE NOT NULL
) INHERITS (cidades);

Neste caso, uma linha de capitais herda todas as colunas (nome, população e altitude) de seu pai, as cidades. O tipo de dados da coluna nome é text, um tipo nativo do PostgreSQL para cadeias de caracteres de comprimento variável. A tabela capitais tem uma coluna adicional, estado, que contém a sigla do estado. No PostgreSQL, uma tabela pode herdar de zero ou de várias outras tabelas.

Por exemplo, a consulta a seguir encontra 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;

que retorna:

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

Por outro lado, a consulta a seguir encontra 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)

Neste caso, o ONLY antes de cidades indica que a consulta deve ser executada somente na tabela cidades, e não nas tabelas abaixo de cidades na hierarquia de herança. Muitos comandos que já discutimos — SELECT, UPDATE e DELETE — aceitam a notação ONLY.

Nota

Embora a herança seja frequentemente útil, ela não foi integrada às restrições de unicidade e de chave estrangeira, limitando a sua utilidade. Veja a Seção 5.11 para obter mais detalhes.