我正在构建一个包含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中有一个映射表吗?怎么样?
谢谢!
答案 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)
);
在制作中,您可能希望构建两个可更新视图,一个用于解析页面和统计信息之间的连接,另一个用于解析页面和标记之间的连接。