我有一个关于在 postgresql(9.1) 中实现继承的问题。
目的是建立一个地理层级模型,可以将国家、州和大陆混合起来创建“区域”。然后这些区域也可以与国家等混合在一起,以创建一个真正令人敬畏的区域层次结构
所以在我的逻辑模型中,一切都是一种“地方”。可以通过使用两个“位置”沿边指定来构造区域树。设计如下,在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”中创建任何行。实时调频!Postgres 文档实际上提到了这一点。
问题是 - 有解决方法吗?通过在 region_t 和 country_t 上插入触发器来实现我自己的“继承”是我唯一能想到的。
第二个问题是 - 这种混合节点树结构是否有更好的设计?
由于某些原因,我不想过分依赖 postgres-contrib 功能。也许这很愚蠢,请随意插话,但要温和(并且仅在回答另一个问题之后)!
谢谢