реализация друзей

foma19

Новичок
реализация друзей

Есть таблица с полями:

id
user_id - id пользователя, который послал запрос на дружбу
friend_id - id пользоватлея, которому был послан запрос
date
status

сейчас все реализовано через добавления обратной записи, т.е. например:

user_id = 1, friend_id = 2
user_id = 2, user_id = 1

хочется конечно чтобы не было лишних записей. как бы составить такой запрос чтобы использовать лишь одну запись? чтобы из записи user_id = 1, friend_id = 2 система понимала что и у пользователя с id = 2 есть друг с id = 1.
 

Groove

Новичок
Дружба это не "монолог", это "диалог".
Она всегда двунаправлена, если Вася считает Петю своим другом, то из этого НЕ следует, что и Петя считает Васю своим другом.

В Вашем случае все правильно сделано, ситуация:
user_id = 1, friend_id = 2
user_id = 2, user_id = 1
означает взаимность.

Чтобы правильно построить структуру - надо изначально определиться с какими задачами придется столкнуться, например:
- вывести список друзей user_id=2
- вывести список пользователей, считающих user_id=2 своим другом
- вывести список "взаимных друзей" user_id=2

а если добавить сюда еще и согласие кого то на то, чтобы кто то считал его своим другом, т.е. флаг "friend_id_approve", то можно будет еще и решать задачи типа:
- "user_id=2" хочет дружить с ...
- с "user_id=2" хотят дружить

по моему, "обратная запись" не является избыточной.
 

zerkms

TDD infected
Команда форума
Она всегда двунаправлена, если Вася считает Петю своим другом, то из этого НЕ следует, что и Петя считает Васю своим другом.
в условиях современных социалок - это утверждение ложно.

foma19
чтобы оправдать 2 записи - добавь ещё одно поле "relation_folder" и пусть там хранится "группа" для друга (как вконтакте)
 

foma19

Новичок
Groove:
а если добавить сюда еще и согласие кого то на то, чтобы кто то считал его своим другом, т.е. флаг "friend_id_approve", то можно будет еще и решать задачи типа:
- "user_id=2" хочет дружить с ...
- с "user_id=2" хотят дружить
как раз поле status сейчас за это и отвечает. если потенциальный друг примет предложение или отменить, то это поле будет менять свое значение.

zerkms
хорошая конечно идея на счет групп, но это просто может не понадобиться.

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