06.-Herencia
La herencia es un concepto de bases de datos orientadas a objetos. Abre interesantes nuevas posibilidades de diseño de bases de datos.
Vamos a crear dos tablas: Una tabla citiesy una mesa capitals. Naturalmente, las capitales también son ciudades, así que quieres alguna manera de mostrar las capitales implícitamente cuando listas todas las ciudades. Si eres realmente listo podrías inventar algún esquema como este:
CREATE TABLE capitals (
name text,
population real,
elevation int, -- (in ft)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
elevation int -- (in ft)
);
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 va, pero se pone feo cuando necesitas actualizar varias filas, para una cosa.
Una mejor solución es la siguiente:
CREATE TABLE cities (
name text,
population real,
elevation int -- (in ft)
);
CREATE TABLE capitals (
state char(2) UNIQUE NOT NULL
) INHERITS (cities);
En este caso, una fila de capitalshereda todas las columnas (name, population, y elevation) de su progenitor, cities. El tipo de la columna namees text, un tipo nativo PostgreSQL para cadenas de caracteres de longitud variable. El capitalstabla tiene una columna adicional, state, que muestra su abreviatura estatal. En PostgreSQL, una tabla puede heredar de cero o más otras tablas.
Por ejemplo, la siguiente consulta encuentra los nombres de todas las ciudades, incluidas las capitales de los estados, que se encuentran en una elevación de más de 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 encuentra todas las ciudades que no son capitales de estado y están situadas en una elevación de más de 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 ser atropaleada sólo el cities tablas y no tablas a continuación citiesen la jerarquía de herencias. Muchas de las órdenes que ya hemos discutido. SELECT, UPDATE, y DELETE- apoyar esto ONLYnotación.
Nota
Aunque la herencia es a menudo útil, no se ha integrado con limitaciones únicas o con claves foráneas, lo que limita su utilidad.