Índice que cubre una clave ajena (foreign key)

Una clave ajena es usada para unir dos tablas en un modo lógico, y restringir los cambios que pueden ser aplicados a ellas.

Todo comienza con una tabla maestra, la cual será la tabla referenciada. Necesita tener una clave primaria (bien, realmente las columnas referenciadas solo necesitan ser no nulas y cubiertas por un índice único, pero es realmente un buen consejo tener una clave primaria). La tabla esclava depende de la tabla maestra, en el sentido que las columnas sobre las cuales se crea la clave ajena deben coincidir con la tabla maestra para todas las claves insertadas o actualizadas. La tabla esclava es la tabla referenciante de la clave ajena.

La clave ajena no solo restringe a la tabla referenciante, sino también a la referenciada; el tipo de restricción puede ser RESTRICT, CASCADE o SET NULL. Esto siginifica, que si una fila de la tabla maestra/referenciada es cambiada (actualizada o eliminada), todas las tablas referenciantes son verificadas para ver si la operación es válida, y si hay alguna acción adicional a ejecutar; vea la documentación de PostgreSQL acreca de claves ajenas (foreign keys) para mayores detalles.

Esto significa que a cada acceso de actualización a una fila específica de la tabla referenciada, una correspondiente lectura es ejecutada en cada una de las tablas referenciantes, usando las columnas de la clave ajena como clave de acceso. Consecuentemente, todas las reglas de diseño que deberían ser tomadas en cuenta para buenas prestaciones de lectura usualmente también se aplican a las columnas en una tabla referenciante. Para buena prestación, un índice es aconsejable en la mayoría de los casos. PostgreSQL no obliga a ello de ninguna forma, así que depende del diseñador de la base de datos el proveer un índice.

Como un conveniencia, pgAdmin III provee una simple casilla de verificación cuando se crea una clave ajena, que verificará automáticamente la presencia de un índice usable, y creará uno por usted si no se encuentra uno. Como con todos los índices, hay casos raros donde tal índice degrada un poco sus prestaciones totales, pero en general la falta de índices degrada más las prestaciones que tener demasiados.