La herencia es un concepto de las bases de datos orientadas a objetos. Abre nuevas e interesantes posibilidades para el diseño de bases de datos.
Creemos dos tablas: una tabla cities y una tabla capitals.
Naturalmente, las capitales también son ciudades, por lo que querrás tener alguna forma de mostrar las
capitales de manera implícita al listar todas las ciudades. Si eres muy ingenioso, podrías inventar un esquema
como este:
CREATE TABLE capitals (
name text,
population real,
elevation int, -- (en pies)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
elevation int -- (en pies)
);
CREATE VIEW cities AS
SELECT name, population, elevation FROM capitals
UNION
SELECT name, population, elevation FROM non_capitals;
Esto funciona bien en cuanto a consultas se refiere, pero se vuelve problemático cuando necesitas actualizar varias filas, por ejemplo.
Una mejor solución es esta:
CREATE TABLE cities ( name text, population real, elevation int -- (en pies) ); CREATE TABLE capitals ( state char(2) UNIQUE NOT NULL ) INHERITS (cities);
En este caso, una fila de capitals hereda todas las columnas
(name, population y elevation)
de su padre, cities. El tipo de la columna
name es text, un tipo nativo de PostgreSQL
para cadenas de caracteres de longitud variable. La tabla capitals tiene una columna
adicional, state, que muestra la abreviatura de su estado. En
PostgreSQL, una tabla puede heredar de cero o más tablas.
Por ejemplo, la siguiente consulta busca los nombres de todas las ciudades, incluyendo las capitales de estado, que están situadas a una altura superior a 500 pies:
SELECT name, elevation FROM cities WHERE elevation > 500;
que devuelve:
name | elevation -----------+----------- Las Vegas | 2174 Mariposa | 1953 Madison | 845 (3 rows)
Por otro lado, la siguiente consulta busca todas las ciudades que no son capitales de estado y están situadas a una altura superior a 500 pies:
SELECT name, elevation
FROM ONLY cities
WHERE elevation > 500;
name | elevation -----------+----------- Las Vegas | 2174 Mariposa | 1953 (2 rows)
Aquí el ONLY antes de cities indica que la consulta debe ejecutarse solo
sobre la tabla cities, y no sobre las tablas que estén por debajo de
cities en la jerarquía de herencia. Muchos de los comandos que ya hemos discutido —
SELECT, UPDATE y DELETE — soportan esta
notación ONLY.
Aunque la herencia suele ser útil, no se ha integrado con las restricciones de unicidad (unique constraints) ni con las claves foráneas, lo que limita su utilidad. Consulta el Section 5.11 para más detalles.