継承

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 3章高度な諸機能 | 早送り | 次のページ

# 3.5. 継承

継承とはオブジェクト指向データベースの概念です。データベース設計において重要でこれまでになかった可能性を広げてくれます。

2 つのテーブルを作ってみましょう。`cities（都市）` テーブルと `capitals（行政府所在地）` テーブルです。行政府所在地は本来同時に都市でもありますので、すべての都市をリストする時はなにもしなくても行政府所在地も表示するなんらかの方法が必要です。賢い人ならつぎのような案を工夫するでしょう。

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

    CREATE TABLE non_capitals (
      name       text,
      population real,
      altitude   int     -- (in ft)
    );

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

問い合わせを続ける分には問題はありませんが、たった一つ、いくつか複数の行を更新するときに醜くなります。

よりよい解決策はつぎのような構文です。

    CREATE TABLE cities (
      name       text,
      population real,
      altitude   int     -- (in ft)
    );

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

この例では、`capitals（行政府所在地）` テーブルの行は親 の `cities（都市）` テーブルからすべての列、すなわち `name（都市名）`、`population（人口）` そして `altitude（標高）` を 継承 します。`name` 列のデータ型は、可変長文字列のために PostgreSQL がはじめから備えている `text` 型です。州の行政府所在地のテーブルは、これに加えて州を示す state 列を持ちます。PostgreSQL でテーブルは関連付けられたテーブルがあればそれぞれから属性を継承することができます。

以下の問い合わせの例は、行政府所在地を含む標高 500 フィート以上に位置するすべての都市を求めるものです。

    SELECT name, altitude
      FROM cities
      WHERE altitude > 500;

これは以下を返します。

       name    | altitude
    -----------+----------
     Las Vegas |     2174
     Mariposa  |     1953
     Madison   |      845
    (3 rows)

その一方、行政府所在地ではない標高 500 フィート以上に位置する都市を見つけ出したいときはつぎのような問い合わせになります。

    SELECT name, altitude
        FROM ONLY cities
        WHERE altitude > 500;

       name    | altitude
    -----------+----------
     Las Vegas |     2174
     Mariposa  |     1953
    (2 rows)

ここで `cities（都市）` の前に置かれた `ONLY` は継承階層において `cities（都市）` テーブルの下層にあるテーブルではなく `cities（都市）` テーブルのみを参照することを意味します。 既に説明した `SELECT`、`UPDATE` および `DELETE` など数多くのコマンドはこの `ONLY` 表記をサポートしています。

> 注意: 継承は便利な事がよくありますが UNIQUE 制約若しくは外部キーと一緒に使えないので有用性に制限がかかります。詳細は 項5.5 を参照してください。

前のページ | ホーム | 次のページ
トランザクション | 上に戻る | まとめ