Я хотел бы иметь комбинацию из двух столбцов на основе ограничения столбцов. Я не нахожу здесь способа использовать внешний ключ, потому что он должен быть условным FK. Надеюсь, что этот базовый SQL показывает проблему:
CREATE TABLE performer_type (
id serial primary key,
type varchar
);
INSERT INTO performer_type ( id, type ) VALUES (1, 'singer'), ( 2, 'band');
CREATE TABLE singer (
id serial primary key,
name varchar
);
INSERT INTO singer ( id, name ) VALUES (1, 'Robert');
CREATE TABLE band (
id serial primary key,
name varchar
);
INSERT INTO band ( id, name ) VALUES (1, 'Animates'), ( 2, 'Zed Leppelin');
CREATE TABLE gig (
id serial primary key,
performer_type_id int default null, /* FK, no problem */
performer_id int default null /* want FK based on previous FK, no good solution so far */
);
INSERT INTO gig ( performer_type_id, performer_id ) VALUES ( 1,1 ), (2,1), (2,2), (1,2), (2,3);
Теперь последний INSERT работает, но для последних 2 пар значений мне бы это не понравилось, потому что нет ни идентификатора певца 2, ни идентификатора группы 3. Как установить такое ограничение?
Я уже задавал похожий вопрос в контексте Mysql , и единственным решением было использование триггера. Проблема с триггером была: у вас не может быть динамического списка типов и набора таблиц. Я хотел бы добавить типы (и связанные таблицы) на лету.
Я также нашел очень многообещающий паттерн , но это для меня с ног на голову, я так и не понял, как заставить его работать в моем случае.
То, что я здесь ищу, кажется мне настолько полезным паттерном, я думаю, что для этого должен быть какой-то общий путь. Это 1014 *
Edit.
Кажется, я выбираю плохие элементы в своих примерах, поэтому я стараюсь прояснить: между разными таблицами исполнителей (singer
и band
) есть NO отношение между ними. gig
-таблица просто должна перечислять задачи для разных исполнителей, не устанавливая никаких отношений между ними.
В другом примере были бы товары на складе: у меня может быть item_type
-таблица, которая определяет сотни типов предметов со связанными таблицами (например, orange
и house
), и должна быть таблица stock
который зачисляет все виды предметов.
PostgreSQL, который я использую - 9,6