Отношение многие ко многим без таблицы ассоциаций - PullRequest
0 голосов
/ 20 января 2020

Насколько мне известно, если вы делаете много-много отношений, я всегда использовал association table. Тем не менее, теперь у меня есть требование от бизнеса (не уверен, что у них есть знания в области БД) создавать relationships между двумя таблицами напрямую. Для меня это невозможно. Они говорят, что я должен сделать следующее, например, что они говорят:

TableA
ID (PK)
refKey

TableB
ID (PK)
refKey

Сделать много ко многим между TableA.refKey и TableB.refKey. Возможно ли что-то подобное ?? Я пытался, но postgres уступил, чтобы создать unique. И .. если я создам unique для любого из refKey, насколько мне известно, это будет 1:M or M:1. Я что-то пропустил? Тем не менее, если вы скажете, что это возможно, приведите пример кода, чтобы инициировать такое соединение на основе этого конкретного примера.

Ответы [ 2 ]

1 голос
/ 20 января 2020

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

В Postgres самый простой способ - получить массив идентификаторов, ссылающихся на вторую таблицу:

create table a (
   a_id int generated always as identity,
   b_ids[] int
);

Почему это вообще плохая идея?

  • Вы не можете легко проверить ограничения внешнего ключа. (Ну, вы можете использовать триггер или UDF.)
  • Вы не можете легко гарантировать уникальность. (Ну, вы можете использовать причудливое ограничение check.)
  • Вы не можете легко увидеть "обратные" отношения. (Ну, вы можете использовать unnest().)
  • Вы не можете легко индексировать элементы массива в a.

Другими словами, множество «встроенных» при этом отсутствует функциональность.

Следует отметить, что вы можете сделать это и с JSON, а также с массивами.

1 голос
/ 20 января 2020

Вы правы, что будут только отношения один-ко-многим или один-ко-многим. Вам нужна присоединяющаяся таблица, например:

create table A_B (
    A_id bigint references A,
    B_id bigint references B
)

Тогда у вас может быть столько строк с тем же A_id или B_id, сколько вы хотите. Это приводит к отношениям «многие ко многим».

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