La herencia es un concepto de bases de datos orientadas a objetos que abre nuevas posibilidades interesantes de diseño de bases de datos.
Creemos dos tablas: una tabla de ciudades (cities) y otra tabla de capitales (capitals). Naturalmente, las capitales también son ciudades, así que uno quisiera tener cierta forma de mostrar las capitales de manera implícita cuando se listan las ciudades. Si uno es realmente inteligente inventaría un esquema como este:
CREATE TABLE capitals (
name text,
population real,
altitude int, -- (en pies)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
altitude int -- (en pies)
);
CREATE VIEW cities AS
SELECT name, population, altitude FROM capitals
UNION
SELECT name, population, altitude FROM non_capitals;
Esto funciona bien para las consultas, pero se va poniendo feo cuando se necesita actualizar varias filas.
Una mejor solución es esta:
CREATE TABLE cities (
name text,
population real,
altitude int -- (en pies)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
En este caso, una fila de capitals hereda todas las columnas de su tabla madre, cities (name, population y altitude). El tipo de dato de la columna name es text, que es un tipo de dato nativo de PostgreSQL para cadenas de letras de longitud variable. Las capitales de estado tienen una columna adicional, state, que muestra su estado. En PostgreSQL, una tabla puede heredar de cero o más tablas.
Por ejemplo, la siguiente consulta encuentra el nombre de todas las ciudades, incluyendo las capitales, que están ubicadas a una altitud superior a los 500 pies:
SELECT name, altitude
FROM cities
WHERE altitude > 500;
Resultado:
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
Madison | 845
(3 rows)
Por otro lado, la siguiente consulta encuentra todas las ciudades que no son capitales de estado y que están situadas a una altitud igual o superior a 500 pies:
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
(2 rows)
Aquí, el ONLY antes de cities indica que la consulta debe ejecutarse solamente sobre la tabla de ciudades y no sobre las tablas que están debajo de ella en la jerarquía de herencia. Muchas de las órdenes que ya se han mencionado (SELECT, UPDATE y DELETE) admiten la notación ONLY.
Nota
Aunque la herencia es útil con frecuencia, no ha sido integrada con restricciones únicas ni con claves foráneas, lo que limita su utilidad. Vea la Sección 5.8 de la documentación de PostgreSQL para más detalles.
Hasta aquí llega este tutorial. PostgreSQL tiene muchas más características que no se tocaron en este tutorial introductorio. Estas características se discuten con más detalle en la Documentación de PostgreSQL.