継承はオブジェクト指向データベースでの概念です。データベース設計における重要な新しい可能性を広げます。
2 つのテーブルを作成します。cities(都市) テーブルと capitals(行政府所在地) テーブルです。行政府所在地は本来同時に都市でもありますので、すべての都市をリストする時は暗黙的に行政府所在地も表示するなんらかの方法が必要です。賢い人ならつぎのような案を工夫するかもしれません。
CREATE TABLE capitals ( name text, population real, altitude int, 77 (in ft) state char(2) ); CREATE TABLE non_capitals ( name text, population real, altitude int 77 (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 77 (in ft) ); CREATE TABLE capitals ( state char(2) ) INHERITS (cities);
この事例で capitals(行政府所在地)テーブルの行は親から cities(都市) テーブルのすべての列 name(都市名)、 population(人口) そして altitude(標高))のすべてを 継承します。name 列は可変長文字列にたいして PostgreSQL が始めから備えているデータ型です。州の行政符所在地は、そこが所在する州を示す state 列を別に所有しています。
以下の問い合わせの例は行政府所在地を含む標高 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 表記をサポートしています。