У меня есть одна таблица person
и две таблицы foo
и bar
, которые обе ссылаются на person
с внешними ключами с именем person_id
. Мне нужно создать таблицу связей, которая связывает один foo
с одним bar
, но оба должны ссылаться на один и тот же person
.
Как я могу выразить это в реляционной структуре, используя только декларативные конструкции? Или мне нужно создать триггер для обеспечения этого?
CREATE TABLE person
(id int primary key, name text);
INSERT INTO person
(id, name)
VALUES
(1, 'John'),
(2, 'Jane');
CREATE TABLE foo
(id int primary key, person_id int references person(id) not null, comment text);
INSERT INTO foo
(id, person_id, comment)
VALUES
(1, 1, 'John is great'),
(2, 2, 'Jane is great');
CREATE TABLE bar
(id int primary key, person_id int references person(id) not null, comment text);
INSERT INTO bar
(id, person_id, comment)
VALUES
(1, 1, 'John is super great'),
(2, 2, 'Jane is super great');
CREATE TABLE foo_bar
(id int primary key, foo_id int references foo(id), bar_id int references bar(id));
INSERT INTO foo_bar
(id, foo_id, bar_id)
VALUES
(1, 1, 1),
(2, 1, 2), -- Shouldn't be possible!
(3, 2, 1), -- Shouldn't be possible!
(4, 2, 2);
Как показывает этот запрос, вполне возможно получить результаты, если строка в foo_bar
ссылается на данные для Джона и Джейн:
select foo.comment, bar.comment from foo_bar
inner join foo ON foo.id = foo_bar.foo_id
inner join bar ON bar.id = foo_bar.bar_id;
Результат:
John is great, John is super great
John is great, Jane is super great
Jane is great, John is super great
Jane is great, Jane is super great
SQL Fiddle: http://sqlfiddle.com/#!17/40c78/3