Postgres table inheritance 会这样工作:
create table music (
id serial primary key,
common1 int not null,
common2 boolean not null
);
create table symphony (
layers int not null,
at1 text not null
) inherits(music);
create table concerto (
lead text not null,
strings integer not null
) inherits(music);
考虑我们是否在每个表中都有一行。
insert into concerto (common1, common2, lead, strings)
values (1, true, 'a', 5);
insert into symphony (common1, common2, layers, at1)
values (2, false, 3, 'b');
insert into music (common1, common2)
values (3, true);
它们都是一排排的音乐。
-- Fetches id, common1, and common2 from all rows.
select *
from music
如果您只想查询音乐中的行,请指定only music。
-- Fetches id, common1, and common2 from only the one row in music.
select *
from only music
如果你想使用交响乐列,你必须查询交响乐。
-- Fetches id, common1, common2, layers, at1 only from symphony
select *
from symphony
Try it
更传统的结构会像这样使用连接表:
create table music (
id serial primary key,
common1 int not null,
common2 boolean not null
);
create table music_symphony (
music_id integer references music(id),
layers int not null,
at1 text not null
);
create table music_concerto (
music_id integer references music(id),
lead text not null,
strings integer not null
);
insert into music (id, common1, common2)
values (1, 1, true);
insert into music_concerto(lead, strings)
values ('a', 5);
insert into music (id, common1, common2)
values (2, 2, false);
insert into music_symphony (music_id, layers, at1)
values (2, 3, 'b');
insert into music (id, common1, common2)
values (3, 3, true);
-- Fetch all symphonies
select *
from music m
join music_symphony ms on ms.music_id = m.id
Try it