Удивление, как Facebook делает функцию “Mutual friends”

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

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

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

Спасибо.

--

Приложение разрабатывается в Python, BTW

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

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

6
задан Pierre 29 March 2010 в 09:43
поделиться

3 ответа

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

4
ответ дан 16 December 2019 в 21:37
поделиться

Допустим, у вас есть таблица с именем Users , а первичный ключ - UserID . Затем у вас есть таблица с именем Друзья с двумя столбцами, называемыми 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
4
ответ дан 16 December 2019 в 21:37
поделиться

Я бы разбил это на (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. Затем вы можете позволить базе данных выполнять кеширование и т. Д. Без каких-либо соединений, чтобы замедлить работу.

0
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: