継承

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

# 3.6. 継承

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

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

    CREATE TABLE capitals (
      name       text,
      population real,
      altitude   int,    -- （フィート単位）
      state      char(2)
    );

    CREATE TABLE non_capitals (
      name       text,
      population real,
      altitude   int     -- （フィート単位）
    );

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

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

より良い解決策は次のような構文です。

    CREATE TABLE cities (
      name       text,
      population real,
      altitude   int     -- （フィート単位）
    );

    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`表記をサポートしています。

> 注意: 継承は便利ではありますが、一意性制約もしくは外部キーと一緒に使えないので万能ではありません。 詳細は項5.8を参照してください。

前のページ | ホーム | 次のページ
ウィンドウ関数 | 上に戻る | まとめ