Функция друга SQL - PullRequest
       14

Функция друга SQL

2 голосов
/ 24 января 2009

Что было бы лучшим способом структурировать «функцию» друга.
Это то, что я думаю: Допустим, у меня есть usertable со следующими столбцами: user_id, username, password ... и таблица с именами друзей в столбцах: friend1, friend2, принято.

Если user2 добавляет user1, я хочу, чтобы user2 отображался в профиле user1, а user1 в user2 ...: O

это кажется немного грязным ... есть ли более разумный способ?

Ответы [ 3 ]

4 голосов
/ 24 января 2009
CREATE TABLE (friend_id_a, friend_id_b, accepted)

Определить ограничение: friend_id_a < friend_id_b.

Заполните таблицу своими сущностями следующим образом:

INSERT
INTO friend_friend(friend_id_a, friend_id_b)
VALUES (LEAST(@id1, @id2), GREATEST(@id1, @id2))

Чтобы выбрать всех друзей человека:

SELECT friend_id_b
FROM friend_friend
WHERE friend_id_a = @id
 AND accepted
UNION ALL
SELECT friend_id_a
FROM friend_friend
WHERE friend_id_b = @id
 AND accepted

UNION ALL здесь позволяет вам использовать индексы и избежать дополнительной сортировки для уникальности.

Все вышеизложенное относится к «дружеским отношениям» как к симметричным и антирефлексивным отношениям. Это означает, что:

  • Если a является другом b , то b является другом a

  • a никогда не был другом a

1 голос
/ 24 января 2009

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

[dbo].[Users]{
    User_ID int,
    UserName VarChar,
    Password ...
}

[dbo].[Friends]{
    User1_ID int,
    User2_ID int,
    Accepted bit
}
1 голос
/ 24 января 2009

Я думаю, что ваш дизайн хорош. Вторая таблица friends (первичный ключ friend1, friend2), где присутствует строка f1, f2, если "установится дружба между f1 и f2", и accepted Истинно, если оно действительно установлено, является правильным способом представления отношения «многие ко многим».

(Единственная проблема, связанная с наивным подходом, заключается в том, что вы должны проверить , что f1 друг f2: это может означать, что строка f1, f2 представьте, или , что строка f2, f1 равна +1 для Quassnoi за преодоление этой трудности.)

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