Herencia

La herencia es un concepto de bases de datos orientadas a objetos que abre nuevas posibilidades interesantes de diseño de bases de datos.

Creemos dos tablas: una tabla de ciudades (cities) y otra tabla de capitales (capitals). Naturalmente, las capitales también son ciudades, así que uno quisiera tener cierta forma de mostrar las capitales de manera implícita cuando se listan las ciudades. Si uno es realmente inteligente inventaría un esquema como este:

CREATE TABLE capitals (
  name       text,
  population real,
  altitude   int,    -- (en pies)
  state      char(2)
);

CREATE TABLE non_capitals (
  name       text,
  population real,
  altitude   int     -- (en pies)
);

CREATE VIEW cities AS
  SELECT name, population, altitude FROM capitals
    UNION
  SELECT name, population, altitude FROM non_capitals;

Esto funciona bien para las consultas, pero se va poniendo feo cuando se necesita actualizar varias filas.

Una mejor solución es esta:

CREATE TABLE cities (
  name       text,
  population real,
  altitude   int     -- (en pies)
);

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

En este caso, una fila de capitals hereda todas las columnas de su tabla madre, cities (name, population y altitude). El tipo de dato de la columna name es text, que es un tipo de dato nativo de PostgreSQL para cadenas de letras de longitud variable. Las capitales de estado tienen una columna adicional, state, que muestra su estado. En PostgreSQL, una tabla puede heredar de cero o más tablas.

Por ejemplo, la siguiente consulta encuentra el nombre de todas las ciudades, incluyendo las capitales, que están ubicadas a una altitud superior a los 500 pies:

SELECT name, altitude
  FROM cities
  WHERE altitude > 500;

Resultado:

   name    | altitude
-----------+----------
 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 que están situadas a una altitud igual o superior a 500 pies:

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

Aquí, el ONLY antes de cities indica que la consulta debe ejecutarse solamente sobre la tabla de ciudades y no sobre las tablas que están debajo de ella en la jerarquía de herencia. Muchas de las órdenes que ya se han mencionado (SELECT, UPDATE y DELETE) admiten la notación ONLY.

Nota

Aunque la herencia es útil con frecuencia, no ha sido integrada con restricciones únicas ni con claves foráneas, lo que limita su utilidad. Vea la Sección 5.8 de la documentación de PostgreSQL para más detalles.

Hasta aquí llega este tutorial. PostgreSQL tiene muchas más características que no se tocaron en este tutorial introductorio. Estas características se discuten con más detalle en la Documentación de PostgreSQL.

Tema anterior

Funciones ventana

Próximo tema

Créditos

Esta página