SQL-таблица объединения для одной таблицы в самостоятельную

#sql #postgresql #many-to-many

Вопрос:

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

У меня есть таблица под названием верхняя одежда (которая похожа на куртки и т. Д.), И я хочу создать взаимосвязь «многие ко многим» между экземплярами верхней одежды.

Мне интересно, как лучше всего создать объединенную таблицу для моделирования этой взаимосвязи, которая учитывает тот факт, что AB совпадает с BA. До сих пор у меня есть это (это просто обычная таблица соединений):

 CREATE TABLE outerwear_outerwear_join (
    a_outerwear_id integer REFERENCES outerwear,
    b_outerwear_id integer REFERENCES outerwear,
    PRIMARY KEY(a_outerwear_id, b_outerwear_id)
);
 

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

Ответ №1:

Создайте UNIQUE INDEX , используя least и greatest функции.

 CREATE UNIQUE INDEX unq_test_a_b 
  ON outerwear_outerwear_join ( LEAST(a_outerwear_id, b_outerwear_id), GREATEST( 
a_outerwear_id, b_outerwear_id)); 
 

ДЕМОНСТРАЦИЯ

Комментарии:

1. Хорошо, хорошо! Как бы я определил это в CREATE TABLE приведенном выше заявлении? (Я еще не выполнил его)

2. @HenryWoody : Это заявление, которое будет выполняться отдельно после create table