Как я могу применить ограничения на отношения «многие ко многим» в PostgresSQL? - PullRequest
1 голос
/ 06 февраля 2020

Предположим, у меня есть две таблицы: thread и user, с таблицей соединений thread_user, которая моделирует отношения между многими.

Предположим, я хочу применить следующие ограничения :

  • A thread может иметь не более 10 user с.
  • Нет двух thread с, которые должны иметь одинаковый набор user с.

Как это можно сделать? Первое ограничение кажется достаточно простым для применения с помощью триггера (есть ли лучший подход?) Второе ограничение я понятия не имею, как обеспечить соблюдение.

1 Ответ

4 голосов
/ 06 февраля 2020

Я мог бы представить комбинацию триггеров и ограничений / индексов. На самом деле, вы могли бы просто использовать триггеры, но для этого нужно обрабатывать обновления, вставки и удаления.

Вместо этого вы можете изменить threads, чтобы иметь два дополнительных столбца:

  • Количество пользователей
  • Массив пользователей

Вы можете поддерживать их в актуальном состоянии с помощью триггеров. На самом деле, первое действительно не нужно.

Затем вы можете создать проверочное ограничение:

alter table t add constraint chk_t_num_users (num_users <= 10);

Если вы сохраняете массив в отсортированном порядке, вы можете просто добавить уникальный индекс:

create unique index unq_t_users on (users);

Или вы можете определить свою собственную функцию sort_array(), как в этом ответе .

...