postgresql(9.1) での継承の実装について質問があります。
目的は、国、州、大陸を混ぜ合わせて「地域」を作成できる地理的階層モデルを構築することです。そして、これらの地域も国などと混同して、本当に素晴らしい地域階層を作成できます
したがって、私の論理モデルでは、すべてが一種の「場所」です。領域ツリーは、2 つの「場所」を使用してエッジワイズを指定することで構築できます。設計は以下のとおりで、Java 層で管理しやすくなっています。
create table place_t (
place_id serial primary key,
place_type varchar(10)
);
create table country_t (
short_name varchar(30) unique,
name varchar(255) null
) inherits(place_t);
create table region_t(
short_name varchar(30),
hierarchy_id integer, -- references hierarchy_t(hierarchy_id)
unique(short_name) -- (short_name,hierarchy_id)
) inherits(place_t);
create table region_hier_t(
parent integer references place_t(place_id), -- would prefer FK region_t(place_id)
child integer references place_t(place_id),
primary key(parent,child)
);
insert into region_t values(DEFAULT, 'region', 'NA', 'north american ops');
insert into region_t values(DEFAULT, 'region', 'EMEA', 'europe and middle east');
insert into country_t values(DEFAULT, 'country', 'US', 'USD', 'united states');
insert into country_t values(DEFAULT, 'country', 'CN', 'CND', 'canada');
ここまでは順調ですね。しかし、以下は失敗します:
insert into region_hier_t
select p.place_id, c.place_id
from region_t as p, country_t as c
where p.short_name = 'NA' and c.short_name = 'US';
その理由は、最初の 4 回の挿入で「place_t」に行が作成されなかったためです。RTFM!Postgres docs は実際にこれについて言及しています。
質問は - 回避策はありますか? region_t と country_t にトリガーを挿入して、独自の「継承」を実装することしか考えられません。
2 番目の質問は、このような混合ノード ツリー構造のより良い設計があるかどうかです。
特定の理由から、postgres-contrib 機能にあまり依存したくありません。ばかげているかもしれませんが、お気軽に声をかけてください。
ありがとう