[pgsql-jp: 28579] Re: INHERITS による継承について

Jun Kitamura kitamura @ zoozee.jp
2003年 1月 8日 (水) 04:39:30 JST


北村@zoozee です。

> > > 表の継承とはそのようなものなのでしょうか。
> > > てっきり、ono_ko や ono_ko2にしか挿入されていないものと思って
> > > ました。
> > 
> > 元のテーブルに(あたかも)INSERT されたような形になります。
> 
> 「あたかも」とは、実際には元テーブルにデータが挿入されていない
> と言う事でしょうか。

ソースを追ったわけではないので確実ではありませんが、挿入され
ていないと思います。継承先テーブルに INSERT したときに、継承
元と継承先の二つに同じデータが INSERT されるのか、という質問
であれば、継承先テーブルに INSERT されるだけで、継承元には 
INSERT されません。

継承元のテーブルを SELECT する時は、継承先のインスタンス(1行
1行のレコードデータ)を、継承元の型(クラス)に当て込んでいる、
というイメージだと思います。このあたりが、PostgreSQL が 
Objective である、という理由になっていると思います。

> > これは、元テーブルを SELECT することにより、継承先の全てのタ
> > プルを SELECT できる、というメリットの意味が強いです。
> 
> 結局参照するのは継承先の表なのですから、あまりメリットとは
> 感じられません。(^^;;
> 継承元表のデータ量をディスク要領的に考慮する必要がないので
> あれば良いのですが。

浦本さんがML:28578 で書かれているとおりなので例は割愛します
が、継承元を SELECT することにより、基本となる型(基クラス)を
使って派生された型(テーブル)のデータを全て拾える、という事を
念頭において設計すべきです。Objective といわれるゆえんです。

継承先のテーブルしか SELECT しない、というのであれば、それは
「継承」する必要がありません(継承すべきではない、とまでは言
いません。このあたりはデータベース設計者の好みなのではないで
しょうか)。

INHERITS は、複数のテーブルで繰り返し使えるカラム(フィールド)
の集まりを一度に定義できる機能、ではありません。

もし、テーブル定義が面倒なのであれば、
create t1 ( a int2, b int2 );
select *,0::int2 as c into t2 from t1 where 1 = 0;
とすれば、t1 の a,b カラムを引き継ぎ、c カラムを追加した t2 
というテーブルが生成されます。

ではでは。





pgsql-jp メーリングリストの案内