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.