Как объединить два FK из таблицы в другую таблицу? - PullRequest
0 голосов
/ 12 ноября 2011

У меня есть таблица отношений многих ко многим:

Таблица relationship:

relationship_id,
first_user REFERENCES users(user_id),
second_user REFERENCES users(user_id),

Таблица users:

user_id,
other user information

Чтобы прочитать друзей данного пользователя (которые могут быть в first_user или second_user), мне нужно присоединиться к двум таблицам (relationships и users), но два столбца таблицы relationships - это FK

Вопрос 1: Как можно объединить две таблицы для использования обоих FK?

У меня есть таблица для ожидающих запросов, которая похожа на таблицу relationships.После утверждения запроса он будет удален из requests и вставлен в relationships.

Вопрос 2: Как можно объединить три таблицы для получения запросов на подключение и ожидающих запросов в одном запросе.

Ответы [ 3 ]

2 голосов
/ 12 ноября 2011

Вам нужно будет указать экземпляры псевдонимов таблицы «users», чтобы вы могли обращаться к ним отдельно:

SELECT u1.*, u2.* FROM relationship r
  JOIN users u1 ON (u1.user_id = r.first_user)
  JOIN users u2 ON (u2.user_id = r.second_user)

Для выбора из запросов и отношений вы можете использовать UNION :

SELECT u1.*, u2.* FROM relationship r
  JOIN users u1 ON (u1.user_id = r.first_user)
  JOIN users u2 ON (u2.user_id = r.second_user)
UNION
SELECT u1.*, u2.* FROM requests r
  JOIN users u1 ON (u1.user_id = r.first_user)
  JOIN users u2 ON (u2.user_id = r.second_user)
1 голос
/ 12 ноября 2011

Таблица {relations_id, first_user, second_user} содержит повторяющуюся группу .

Просто удалите одну из них (что делает Relations_id неуникальным) и добавьте суррогатный ключ (или добавьтеидентификатор пользователя для первичного ключа).

CREATE TABLE relationships
( id INTEGER NOT NULL PRIMARY KEY
, relationship_id INTEGER NOT NULL
, user_id INTEGER NOT NULL REFERENCES users(user_id)
);

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

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

 CREATE TABLE lusers
 ( luser_id INTEGER NOT NULL PRIMARY KEY
 , magnificent_other INTEGER REFERENCES lusers (luser_id)
 ...
 );

В качестве побочного эффекта это также сделает невозможным двоеженство.Опять же: хорошее домашнее задание для реализации ограничений.

1 голос
/ 12 ноября 2011

Чтобы использовать оба внешних ключа, вам нужно два объединения (по одному для каждого):

select * 
  from relationship r 
 inner join users u1 on (u1.user_id = r.first_user)
 inner join users u2 on (u2.user_id = r.second_user)
...