Herencia

La herencia es un concepto de las bases de datos objeto-relacionales. Esto abre nuevas posibilidades para el diseño de bases de datos.

Creemos dos tablas: Una tabla ciudades y una tabla capitales. Naturalmente, las capitales son ciudades, por lo que quizás quiera mostrar implícitamente las capitales cuando liste las ciudades. Si es inteligente , podría pensar un esquema así:

CREATE TABLE capitales (
  nombre       text,
  poblacion real,
  altitud   int,    -- (in ft)
  estado      char(2)
);

CREATE TABLE no_capitales (
  nombre       text,
  poblacion real,
  altitud   int     -- (in ft)
);

CREATE VIEW ciudades AS
  SELECT nombre, poblacion, altitud FROM capitales
    UNION
  SELECT nombre, poblacion, altitud FROM no_capitales;

Esto funciona bien ya que la consulta funciona, pero se ve feo a la hora de actualizar algunas filas para una cosa.

Una mejor solución es:

CREATE TABLE ciudades (
  name       text,
  population real,
  altitude   int     -- (in ft)
);

CREATE TABLE capitales (
  state      char(2)
) INHERITS (cities);

En este caso, un registro de capitales hereda todas las columnas (name, population, y altitude) de la tabla padre, ciudades. El tipo de la columna name es texto, un tipo nativo de PostgreSQL para campos variables de caracter. Las capitales poseen una columna adicional state, que muestra el estado al que pertenece la capital. En PostgreSQL, una tbala puede heredar desde cero a más tablas.

Por ejemplo, la siguiente consulta encuentra los nombre de todas las ciudades, incluido el estado de algunas capitales, que estan ubicadas a una altitud superior a los 500 pies:

SELECT name, altitude
  FROM ciudades
  WHERE altitude > 500;

retorna:

   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
 Madison   |      845
(3 rows)

Por otra parte, la siguiente consulta encuentra todas las ciudades que no son capitales de estado y que estan situadas a una altitud de 500 pies o superior:

SELECT name, altitude
    FROM ONLY cities
    WHERE altitude > 500;
   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
(2 rows)

La palabra ONLY indica que la consulta deberá correr solo sobre la tabla que le precede, y no sobre las tablas jerarquicamente dependientes. Muchos de los comandos que discutimos - SELECT, UPDATE, and DELETE - soportan esta notación.

Nota: Aunque aa herencia es frecuentemente utlizada, no ha sido integrada con restricciones de unicidad o llaves foráneas, lo que limita su utilidad. Más detalles en  Section 5.8.