在PostgreSQL中,两个兄弟表之间的映射表是不可能的?

时间:2013-10-03 03:00:27

标签: sql postgresql inheritance many-to-many

我正在构建一个包含2个模板的网站:统计数据和标签,但它们之间也有N:M映射。

统计信息和标签在网站上都有自己的页面,这些页面具有共同特征,所以我想要一个名为pages的父表。

create table pages (id serial primary key, title varchar(50));
create table stats (show_average boolean) inherits (pages);
create table tags (color varchar(50)) inherits (pages);
create table stat_tags (
    stat_id int
    ,tag_id int
    ,foreign key (stat_id) references stats(id)
    ,foreign key (tag_id) references tags(id)
);

最后一个查询产生:

ERROR:  there is no unique constraint matching given keys for referenced table "tags"

如果我没有继承这样做:

create table stats (id serial primary key, title varchar(50), show_average boolean);
create table tags (id serial primary key, title varchar(50), color varchar(50));
create table stat_tags (
    stat_id int
    ,tag_id int
    ,foreign key (stat_id) references stats(id)
    ,foreign key (tag_id) references tags(id)
);

...它接受所有查询。

两个孩子有可能在PostgreSQL中有一个映射表吗?怎么样?

谢谢!

1 个答案:

答案 0 :(得分:1)

使用inherits可能不是最好的方法。

  

继承功能的一个严重限制是索引   (包括唯一约束)和外键约束仅适用   单个表,而不是他们的继承子。这是真的   外键约束的引用和引用方。

请参阅Caveats

我会对这些方面的内容更加满意。

create table pages (
  id serial primary key, 
  page_type char(1) not null
    check (page_type in ('s', 't')),
  title varchar(50) not null unique,
  unique (id, page_type)
);

create table stats (
  id integer primary key,
  page_type char(1) not null default 's'
    check(page_type = 's'),
  show_average boolean,
  foreign key (id, page_type) references pages (id, page_type)
);

create table tags (
  id integer primary key,
  page_type char(1) not null default 't'
    check(page_type = 't'),
  color varchar(50) not null
);

create table stat_tags (
  stat_id int not null,
  tag_id int not null,
  primary key (stat_id, tag_id),
  foreign key (stat_id) references stats(id),
  foreign key (tag_id) references tags(id)
);

在制作中,您可能希望构建两个可更新视图,一个用于解析页面和统计信息之间的连接,另一个用于解析页面和标记之间的连接。