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 cities
y 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 capitals
hereda todas las columnas (name
, population
, y elevation
) de su progenitor, cities
. El tipo de la columna name
es text
, un tipo nativo PostgreSQL para cadenas de caracteres de longitud variable. El capitals
tabla 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 cities
en la jerarquía de herencias. Muchas de las órdenes que ya hemos discutido. SELECT
, UPDATE
, y DELETE
- apoyar esto ONLY
notació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.