1

我正在使用 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 中拥有一个映射表?如何?

谢谢!

4

1 回答 1

3

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

继承特性的一个严重限制是索引(包括唯一约束)和外键约束仅适用于单个表,而不适用于它们的继承子表。在外键约束的引用侧和被引用侧都是如此。

注意事项

我会更喜欢这些方面的东西。

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)
);

在生产环境中,您可能希望构建两个可更新视图,一个用于解决页面和统计信息之间的连接问题,一个用于解决页面和标签之间的连接问题。

于 2013-10-03T03:25:14.913 回答