Уникальное ограничение, включающее серийный первичный ключ в postgresql - PullRequest
0 голосов
/ 03 марта 2020

У меня есть postgresql таблицы со следующим макетом:

create table bar(
    bar_id serial primary key,
    ... other columns
)
create table foo(
    foo_id serial primary key,
    bar_id bigint not null,
    ... other columns
)
create table baz(
    baz_id serial primary key,
    foo_id bigint not null references foo(foo_id),
    bar_id bigint not null references bar(bar_id),
    constraint fk_fb foreign key (foo_id, bar_id) references foo(foo_id, bar_id)
)

Я хочу сослаться на foo_id и bar_id в другой таблице (baz) и иметь ограничение внешнего ключа, поэтому мне нужно добавить уникальное ограничение для (foo_id, bar_id). Тот факт, что foo_id является первичным ключом, гарантирует, что комбинация foo_id и bar_id уникальна, даже если все значения bar_id одинаковы. Мой вопрос: есть ли снижение производительности при добавлении ограничения уникальности для (foo_id, bar_id) или если postgresql достаточно умен, чтобы знать, что тот факт, что foo_id уникален по всей таблице благодаря тому, что является первичным ключом, означает, что с bar_id ничего делать не нужно.

Таблица foo содержит строки, которых нет в baz, поэтому удаление bar_id из таблицы foo не будет работать.

1 Ответ

0 голосов
/ 03 марта 2020

Существует снижение производительности за добавление другого ограничения UNIQUE, поскольку такое ограничение реализовано с помощью индекса, который необходимо обновлять для каждой модификации данных в таблице.

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

Возможно, вы также можете придумать альтернативную модель данных, которая не требует от вас ссылаться на оба столбца с внешним ключом, как предложил GMB в своем ответе.

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