Социальное приложение для моделирования: заказывайте лайки пользователями, на которых я подписан - PullRequest
0 голосов
/ 09 октября 2018

Фон :

  • Instagram позволяет пользователям просматривать полный список людей, которым понравился любой пост
  • Список «лайкеров» оценивается такчто люди, за которыми вы следите, всегда отображаются сгруппированными вверху списка лайков
  • Это работает мгновенно даже для постов с более чем 10 миллионами лайков и для пользователей, которые подписываются на 1000+ человек

Как мне смоделировать мои данные (в идеале в MySQL) для репликации этого типа функциональности?


Что я пробовал:

Этопросто вернуть лайки пользователям, за которыми я следую вверху постранично :

SELECT uid, date,
EXISTS(SELECT 1 FROM Follows a WHERE a.uid = "1" and a.followsUid = Likes.uid limit 1) as youFollow
FROM Likes WHERE pid = 30 
ORDER BY youFollow DESC, date DESC LIMIT 10

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

Есть лиЕсть ли способ добиться этого, не сканируя каждую строку «как» для сообщения?

Единственный другойПодход, который я могу придумать, - это модель «веер» / «входящие», когда пользователи подписываются на людей, которым они следуют.Затем я мог бы запросить что-то вроде select * from LikeEvents where uid IN (people I follow) and postId = pid, но, похоже, это приведет к большому количеству избыточных данных

1 Ответ

0 голосов
/ 09 октября 2018

Одним из самых простых способов является объединение таблицы Likes и таблицы Follow и сортировка по набору результатов.Например:

SELECT Likes.uid, Likes.date FROM Likes 
LEFT JOIN Follows ON Follows.uid = 1 AND Follows.followsUid = Likes.uid
WHERE Likes.pid = 30 
ORDER BY Follows.uid DESC, Likes.date DESC LIMIT 10

Конечно, если вам следует избегать полного сканирования таблицы, вы должны создать индексы для таблицы Likes и таблицы Follows.Например:

CREATE INDEX likes_pid on Likes(pid);
CREATE INDEX follows_uid on Follows(uid);

Другим способом является создание столбца ранга в таблице Likes и сортировка набора результатов по нему.

SELECT * FROM Likes WHERE Likes.pid = 30 ORDER BY rank DESC, date DESC LIMIT 10

Естественно, вы должны рассчитать и обновить столбец рейтинга при создании Like

...