post icon

Herencia de Tablas en PostgreSQL

Este es el artículo nº 200 publicado en Devtroce y deseo escribir sobre algún tema de base de datos, y pensé en particionamiento horizontal en Postgre pero el mismo requiere conocimientos sobre herencias de tablas para llevarlo a cabo, entonces decidí escribir sobre ésta característica que ningún otro motor presenta.

Llamativamente la guerra de la orientación a objetos ganó en el campo de los lenguajes de aplicación pero no en las bases de datos, a pesar de ello Postgre implementa varios conceptos del mismo (aunque en un nivel básico) y otros motores no lo hacen, se dedican más bien a desarrollarse como motores relacionales, aunque tampoco ningún motor del mercado cumple con las 12 reglas de Edgar Codd.

Para comprender éste concepto muy interesante y útil para muchos casos veremos un ejemplo bastante sencillo. Crearemos una tabla llamada ciudades y otras capitales. Las capitales son también ciudades pero supongamos que necesitamos recuperar rápidamente los datos de las ciudades, sin pasar por un índice de tabla que contiene miles o millones de registros. Esa es la mayor virtud a mi punto de vista de las tablas heredades, si la usamos en los contextos correctos podríamos mejorar el rendimiento de una BD altamente concurrida que comience  a sufrir de bloqueos y retrasos importantes en el tiempo de lectura/escritura.

Comenzaremos creando la tabla padre con 3 campos

CREATE TABLE ciudades (
    nombre        text,
    poblacion     float,
    altura        int
);

Ya tenemos el padre, podemos crear un hijo a partir de él. Además le agregaremos 1 columna más que nos dirá a que departamento o estado pertenece ésa capital.

CREATE TABLE capitales (
    departamento           char(2)
) INHERITS (ciudades);

Procedemos a insertar los datos en las respectivas tablas

insert into ciudades values ('Fernando de la Mora', 24522, 25);
insert into ciudades values ('Lambaré', 34500, 135);
insert into ciudades values ('San Lorenzo', 16852, 120);

insert into capitales values ('Asuncion', 450000, 136, 'CN');
insert into capitales values ('Encarnacion', 128000, 120, 'EN');

Seleccionando las tablas veremos los resultados y el comportamiento obtenido. El primer query retornará el siguiente conjunto de resultados.

"Fernando de la Mora";24522;25
"Lambaré";34500;135
"San Lorenzo";16852;120
"Asuncion";450000;136
"Encarnacion";128000;120

Obteniendo los siguiente con el segundo query

"Asuncion";450000;136;"CN"
"Encarnacion";128000;120;"EN"

Con ésto obtenemos una reducción en la construcción del índice y ganaremos velocidad con ello además de un mejor orden conceptual de nuestras tablas. No sólo se puede heredar de un padre, es posible heredar de varias tablas, así teniendo la tabla hija todas las columnas de sus padres, y en caso que 2 o más padres tengan un columna con el mismo nombre éstas se fusionarán en la hija siempre y cuando sean del mismo tipo de dato.

Al utilizar ésta poderosa característica existen algunas consideraciones que hay que tener en cuenta para evitarnos sorpresas desagradables e inesperadas. Al crear tablas heredadas, no todas las características de la tabla se heredan. Por ejemplo, las claves primarias, foráneas, indices únicos. Según el roadmap se verá para implementarlo a futuro pero no es de prioridad alta por eso que viene retrasándose su implementación desde versiones antiguas.

Comentarios desde Facebook:

Trackbacks/Pingbacks

  1. Como hacer Particionamiento Horizontal de Tablas en PostgreSQL | DevTroce.com WordPress - 14 noviembre 2010

    […] necesitaremos el conocimiento previo de herencia de tablas en éste motor, lo pueden leer aquí si lo […]

Responder