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.
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.