[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 メーリングリストの案内