Как моделировать дружеские отношения
Я пытался понять, как это сделать, и даже глядя на другие примеры, я не могу понять это, поэтому, возможно, я смогу получить некоторую персональную помощь.
У меня есть два стола, users_status
а также friendships
,
в users_status
таблица у меня есть поле userid
и несколько других. в friendships
таблица, у меня есть поля request_to
,request_from
, а также friendship_status
,
По сути, я хочу получить все сообщения о статусе текущего пользователя и тех, кто является друзьями текущего пользователя (что я могу указать в своем PHP с помощью переменной $userid).
Вот пример friendships
структура таблицы. Когда отправляется запрос на добавление в друзья, ИД пользователя отправителя и получателя помещаются в таблицу, с значением Friends_status, равным 0. Когда запрос принят, для параметра Friends_status устанавливается значение 1, и эти двое теперь являются друзьями.
friendship_id request_from request_to friendship_status
1 111248 111249 1
2 111209 111249 1
3 111209 111248 0
11 111209 111259 1
5 111252 111209 1
12 111261 111209 1
Я понимаю, что это может быть даже не самая лучшая структура для определения дружеских отношений, тем более что сайт основан на отношениях и необходимость часто проверять наличие дружеских связей.
Возможно, было бы лучше иметь две отдельные таблицы для friend_requests
а также friendships
? Если это так, как бы я структурировать / управлять friendships
Таблица?
2 ответа
Вы можете использовать объединение таблиц (например, http://dev.mysql.com/doc/refman/5.0/en/join.html), чтобы найти все запросы.
На самом деле вы можете использовать подзапрос здесь:
SELECT * FROM users_status WHERE userid = "$userid"
OR userid in (SELECT request_to FROM friendships where request_from = "$userid" AND friendship_status = 1)
OR userid in (SELECT request_from FROM friendships where request_to = "$userid" AND friendship_status = 1)
замещать $userid
с вашим идентификатором пользователя
Самая простая схема, которую я могу придумать:
PENDING_FRIENDSHIPS(request_from, request_to)
FRIENDSHIPS(request_from, request_to)
Я также удалил идентификатор, потому что оба поля в обеих таблицах будут составными первичными ключами (request_from, request_to).
Чтобы получить всех друзей от текущего пользователя, просто запустите:
select * from friendships
where $currentUser = request_from OR $currentUser = request_to
Это вернет оба столбца, и вам придется удалить в PHP текущего пользователя.
Другой способ получить всех друзей из этой схемы - запустить UNION:
select request_from from friendships
where request_to = $currentUser
UNION
select request_to from friendships
where request_from = $currentUser
Недостатком этого решения является то, что вы запускаете 2 выбора