Хотите знать, как Facebook делает функцию "Взаимные друзья" - PullRequest
6 голосов
/ 29 марта 2010

В настоящее время я разрабатываю приложение, позволяющее студентам управлять своими курсами, и я не знаю, как разработать базу данных для определенной функции. Клиент, как и Facebook, очень хочет, чтобы, когда студент отображал список людей, которые в данный момент изучают определенный курс, сначала отображаются люди с большинством взаимных курсов с зарегистрированным пользователем. Почти такая же, как в Facebook функция «Предложения друзей» с дополнительным фильтром.

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

В настоящее время я использую MySQL, планирую использовать Cassandra для некоторых других функций, а также использую Memcached для кэширования результатов и Sphinx для поиска.

Спасибо.

-

Приложение разработано на Python, кстати

И я забыл упомянуть, что стандартный подход (использующий хороший запрос MySQL для вычисления всего этого с помощью предложения ORDER BY) слишком медленный. Так как чтение происходит намного чаще, чем чтение, я бы хотел, чтобы большая часть логики выполнялась один раз, когда добавляется курс отношения <->.

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

Ответы [ 3 ]

4 голосов
/ 29 марта 2010

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

4 голосов
/ 29 марта 2010

Скажем, у вас есть таблица с именем Users, а первичный ключ - UserID. Затем у вас есть таблица с именем Friends с двумя столбцами с именами UserID (PK) и FriendUserID.

.

Скажем, у вас 2 пользователя, 20 и 50.

Когда 20 добавляет 50 в друзья, приложение добавляет новую строку:

INSERT INTO `Friends` (`UserID`, `FriendUserID`) VALUES (20, 50)

и когда 50 подтверждает дружбу, вы добавляете еще одну строку с переключенными значениями:

INSERT INTO `Friends` (`UserID`, `FriendUserID`) VALUES (50, 20)

Если вы хотите найти общих друзей между 20 и 50 годами, просто:

SELECT `UserID` FROM `Friends` AS `A`, `Friends` AS B WHERE `A`.`FriendUserID` = 20 AND `A`.`UserID` = `B`.`UserID` AND `B`.`FriendUserID` = 50
0 голосов
/ 30 марта 2010

Я бы разбил это как (2) запросов и нашел бы пересечение в Python:

#Query 1 - Get the user's friends
SELECT friend_id FROM friends WHERE user_id = 'my user id'

#Query 2 - Get the users enrolled in the course
SELECT student_id FROM course_enrollment WHERE course_id = 'course id'

Тогда найдите пересечение в Python. Затем вы можете позволить базе данных выполнять кэширование и т. Д. Без каких-либо объединений, чтобы замедлить работу.

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