El sistema de reglas de Postgres

Postgres utiliza un poderoso sistema de reglas para la especificación de vistas y actualizaciones de vistas ambiguas. Originalmente el sistema de reglas de Postgres consistía en dos implementaciones:

Para información sobre la sintaxis y la creación de reglas en sistema Postgres Diríjase a la Guía del Usuario de PostgreSQL.

El sistema de reescritura

El sistema de reescritura de la consulta es un módulo entre la etapa de traducción y el planificador/optimizador. Procesa el árbol devuelto por la etapa de traducción (que representa una consulta de usuario) y si existe una regla que deba ser aplicada a la consulta reescribe el árbol de una forma alternativa.

Técnicas para implementar vistas

Ahora esbozaremos el algoritmo del sistema de reescritura de consultas. Para una mejor ilustración, mostraremos como implementar vistas utilizando reglas como ejemplo.

Tengamos la siguiente regla:

  create rule view_rule
  as on select
  to test_view
  do instead
     select s.sname, p.pname
     from supplier s, sells se, part p
     where s.sno = se.sno and
           p.pno = se.pno;
      

Esta regla se disparará cada vez que se detecte una SELECT contra la relación test_view. En lugar de seleccionar las tuplas de test_view, se ejecutará la instrucción SELECT dada en la parte de la acción de la regla.

Tengamos la siguiente consulta de usuario contra test_view:

  select sname
  from test_view
  where sname <> 'Smith';
      

Tenemos aquí una lista de los pasos realizados por el sistema de reescritura de la consulta cada vez que aparece una consulta de usuario contra test_view. (El siguiente listado es una descripción muy informal del algoritmo únicamente para una comprensión básica. Para una descripción detallada diríjase a Stonebraker et al, 1989).

Reescritura de test_view

  1. Toma la consulta dada por la parte de acción de la regla.

  2. Adapta la lista-objetivo para recoger el número y orden de los atributos dados en la consulta del usuario.

  3. Añade la cualificación dada en la cláusula WHERE de la consulta del usuario a la cualificación de la consulta dada en la parte de la acción de la regla.

Dada la definición de la regla anterior, la consulta del usuario será reescrita a la siguiente forma (Nótese que la reescritura se hace en la representación interna de la consulta del usuario devuelta por la etapa de traducción, pero la nueva estructura de datos representará la siguiente consulta):

  select s.sname
  from supplier s, sells se, part p
  where s.sno = se.sno and
        p.pno = se.pno and
        s.sname <> 'Smith';