他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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;

問い合わせを続ける分には問題はありませんが、例えば、複数の行を更新する時に醜くなります。

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

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テーブルのみを参照することを意味します。 既に説明したSELECTUPDATEおよびDELETEなど数多くのコマンドは、このONLY表記をサポートしています。

注記

継承は多くの場合で便利ですが、一意性制約や外部キーと統合されていないので万能ではありません。 詳細は5.9. 継承を参照してください。