無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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 を参照してください。


powered by SEO.CUG.NET