PostgreSQL: проверка наличия ключа в нескольких таблицах - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть эта таблица с комментариями пользователей по проблемам:

create table related_comment (
        id       varchar(20) references trouble_noreset,
        username varchar(20) not null,
        comment  varchar(320) not null,
        created  timestamp default current_timestamp
);

, и все работает нормально.Но теперь после некоторого использования появилась новая таблица, похожая на существующий problem_noreset - problem_reported .

Поскольку обе таблицы имеют столбец id , но я не хочу объединять их вместе, есть ли способ изменить ограничение для related_comment таблицы?

Из поиска вокруг я понимаю, что я не могу иметьвнешний ключ для нескольких таблиц.

Но, может быть, у меня может быть что-то вроде:

create table related_comment (
        id       varchar(20) check (id exists in trouble_noreset or id exists in trouble_reported),
        username varchar(20) not null,
        comment  varchar(320) not null,
        created  timestamp default current_timestamp
);

?Я использую PostgreSQL 8.4.7 с CentOS 5.5

Спасибо!Alex

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Похоже, ваш внешний ключ задом наперед. Я бы добавил другую таблицу для комментариев (related_comment_thread), FK related_comment до related_comment_thread, затем FK trouble_noreset и trouble_reported до related_comment_thread:

related_comment_thread (
    -- standard bookkeeping stuff like ids and timestamps
)
related_comment (
    -- as now but no FK for id, each comment gets its own unique id
    thread references related_comment_thread
)
trouble_noreset (
    -- what's there now
    comments references related_comment_thead
)
trouble_reported (
    -- what's there now
    comments references related_comment_thead
)

Таким образом, вы получаете разумную ссылочную целостность для всех ваших таблиц за счет дополнительного объединения; реляционные базы данных хороши в соединениях, поэтому беспокоиться не о чем. Этот подход также упрощает добавление комментариев в другую таблицу, если вам понадобится такая вещь в будущем.

0 голосов
/ 13 апреля 2011

Чтобы сделать таблицу related_comment полезной, вы должны в любом случае использовать разные ключи для таблиц Trouble_Noreset и Trouble_reported, иначе вы не знаете, как присоединиться.

Я бы реализовал это следующим образом:

create table related_comment (
        id int4 primary key,
        noreset_id       varchar(20),
        trouble_id       varchar(20),
        username varchar(20) not null,
        comment  varchar(320) not null,
        created  timestamp default current_timestamp
);

и создал бы два обязательных индекса внешнего ключа, а также проверку, которая требует, чтобы был установлен точно один из noreset_id и problem_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...