Реализация взаимооотношений пользователей.

Armageddance

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

Вариант, где для текущего id вписываются через разделитель id пользователей в такие поля как friend_list, black_list и прочее, а потом при выводе парсятся, сразу отпал, ибо это индусский подход.
Видется наиболее рациональным введение таблички вида:
User1_id User2_id User1_stat User2_stat
1 2 1 1
1 3 1 1
1 4 1 0
1 5 0 1
2 3 1 0
и т.д.
Тогда выборка друзей пользователя ID 1 сводилась бы к SELECT User2_id FROM user_relations WHERE user1_id=1 AND USER2_id<>1 AND User1_stat=1 AND User2_stat=1
А выборка черного списка сводилась бы к такому SELECT User2_id FROM user_relations WHERE user1_id=1 AND USER2_id<>1 AND User1_stat=2
При условии, что, например 1 - статус добавленного в друзья, 0 - статус запроса в друзья, 2 - статус черного списка.

Насколько мой подход правильный?
 

Adelf

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

Armageddance

Новичок
"хотя, имхо, лучше разложить на таблицы дружбы, запросов и т.д." - зачем?
Имхо намного удобнее вести все в одной таблице. Допустим, если вы удаляете друга и вносите его в черный список, это на базе в моей реализации отобразится всего в одном запросе. В вашем предлагаемом случае - минимум в двух.
 

Adelf

Administrator
Команда форума
А мы просто не считаем запросы, запускающиеся при модификации данных.
Если вам удобнее все вести в одной таблице - пожалуйста. Когда мы в последний раз реализовывали дружбу - вообще использовали множества из Redis.
 
Сверху