3.6. Herencia #

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.

Note

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.