Я в настоящее время разрабатываю приложение, чтобы позволить студентам управлять своими курсами, и я действительно не знаю, как разработать базу данных для определенной функции. Клиент хочет, много как Facebook, что, когда студент отображает список людей в настоящее время в определенном курсе, люди с большинством взаимных курсов с зарегистрированным пользователем отображены сначала. Почти то же как друг "Функции Facebook предложения" с дополнительным фильтром.
Как дополнительная функция, я хотел бы добавить функцию поиска, чтобы позволить студентам искать другой и отображение сначала в результатах поиска люди с большинством взаимных курсов с зарегистрированным пользователем.
Я в настоящее время использую MySQL, я планирую использовать Cassandra для некоторых других функций, и я также использую Memcached для кэширования результата и Сфинкса для поиска.
Спасибо.
--
Приложение разрабатывается в Python, BTW
И я забыл упоминать, что стандартный подход (использующий хороший запрос MySQL для вычисления все это с пунктом ORDER BY) является wayyyys, также замедляются. Таким образом, поскольку чтения являются намного более частыми, чем чтения, я хотел бы, чтобы большая часть логики произошла однажды, когда люди отношения <-> курс добавляется.
Я думал об обновлении "взаимные курсы", противостоят характерный для одного кортежа (пользователь, курс), который будет увеличен для всех пользователей курса, когда зарегистрированный пользователь присоединится к новому курсу (или уменьшенный, когда он оставляет его).
Если у вас уже есть решение, но проблема заключается только в скорости запроса, попробуйте сделать это раньше. Когда дружеские отношения пользователя изменятся, перезапустите задание, которое вычисляет эти вещи и сохраняет все результаты. Не теряйте его по просьбе, когда вам так быстро нужен результат. Делайте такие дорогостоящие вещи только один раз и делайте их еще до того, как поступит запрос.
Допустим, у вас есть таблица с именем 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
Я бы разбил это на (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. Затем вы можете позволить базе данных выполнять кеширование и т. Д. Без каких-либо соединений, чтобы замедлить работу.