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.