Postgresはビューと あいまいな ビューの更新にも対応できる充実したルールシステム を持っています。もともとは Postgresのルールシステムは二つの実装から 成っていました:
ひとつはタプルレベルの処理を使って 行われ、エグゼキュータの内部に実装されて いました。 個別のタプルがアクセスされるたびに ルールシステムが呼ばれていました。この実装は1995年、最後の Postgres プロジェクトのリソースから Postgres95 へと移行する間に取り除かれました。
ルールシステムの二番目の実装は問い合わせ書き換え と呼ばれるテクニックです。リライトシステムは 構文解析過程とプランナ/オプティマ イザ の間にあるモジュールです。このテクニックは今でも実装されています。
Postgresシステムの構文やルールの作成に関する 情報 については ポストグレスユーザガイドを参照してください。
問い合わせリライトシステムは構文解析過程と プランナ/オプティマイザ の間にあるモジュールです。このシステムは構文解析過程から返された ツリー(ユーザの 問い合わせを表すもの)を処理し、問い合わせに適用されるべきルールがあった 場合は ツリーをそれに合わせて書き直します。
ここでは問い合わせリライトシステムのアルゴリズムをお見せします。 よりわかりやすくするために、ルールを使ってビューを実装する方法 を例として使います。
次のようなルールがあったとします:
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;
このようなルールは、リレーションtest_viewに対する 選択が 認識されると起動されます。 test_viewからタプルを選択する 代わりにアクションパートのルールが実行されます。
test_viewに対する次のようなユーザ問い合わせが あったとします:
select sname from test_view where sname <> 'Smith';
ここにあるのは、test_viewに対するユーザ問い合わせが ある度に 問い合わせリライトシステムが実行する過程のリストです。 このリストは基礎的な理解をうながすためのアルゴリズムをとても簡単に 書いたものです。詳しい説明についてはStonebraker et al, 1989) を見て下さい。
test_viewリライト
ルールの実行部分で与えられた問い合わせを受け取る。
ユーザ問い合わせで与えられた属性の数字と順番が合うように ターゲットリストを調整する。
ユーザ問い合わせの where 句で与えられる制限を、ルールのアクション パートで与えられる問い合わせの制限に追加する。
実際には上記のようにルールが定義され、ユーザ問い合わせは次のような形に 書き換えられます。(書き換えは構文解析過程から返されたユーザ問い合わせの 内部表現に適用されますが、新しく作られたデータ構造は次の問い合わせを 表現しています。
select s.sname from supplier s, sells se, part p where s.sno = se.sno and p.pno = se.pno and s.sname <> 'Smith';