Если ваши дружеские отношения симметричны, вам нужно добавить CHECK(user_id < friend_id)
в определение таблицы и вставить такие данные:
INSERT
INTO friends
VALUES (
(CASE user_id < friend_id THEN user_id ELSE friend_id END),
(CASE user_id > friend_id THEN user_id ELSE friend_id END)
)
В SQL Server
вы можете построить индекс UNIQUE
для пары вычисляемых столбцов:
CREATE TABLE friends (orestes INT, pylades INT, me AS CASE WHEN orestes < pylades THEN orestes ELSE pylades END, friend AS CASE WHEN orestes > pylades THEN orestes ELSE pylades END)
CREATE UNIQUE INDEX ux_friends_me_friend ON friends (me, friend)
INSERT
INTO friends
VALUES (1, 2)
INSERT
INTO friends
VALUES (2, 1)
-- Fails
Чтобы получить всех друзей для данного пользователя, вам нужно выполнить этот запрос:
SELECT friend_id
FROM friends
WHERE user_id = @myuser
UNION ALL
SELECT user_id
FROM friends
WHERE friend_id = @myuser
Однако в MySQL
может быть эффективнее всегда сохранять каждую из двух копий каждой пары.
Вы можете найти эту статью интересной: