Алгоритм френдленты

Имеется 3 таблицы:
1) пользователи (Users: UID)
2) посты, написанные пользователями (Posts: PID, UID, text, date)
3) дружеские связи (Friens: UID, FriendUID)

Задача: быстро показать все посты друзей пользователя, отсортированные по дате (френдлента).

Всё осложняется несколькими пунктами:
1) у пользователей может быть куча друзей (тысячи)
2) у пользователей может быть куча постов (тоже тысячи)
3) они могут захотеть *неожиданно* посмотреть посты из френдленты с 1000 по 1010.

Какие идеи я уже отмела:
0) гугль по запросу «алгоритм френдленты» и «algorithm friendline» ничего не находит.
1) Простой JOIN не подойдёт так как будет тормозить сортировка всех постов по дате.
2) Можно добавить табличку (friendline: UID, PID, date) с индексом (UID, date) и быстро искать по ней. Но тогда добавление/удаление френда с 1000 постов надолго заставит её задуматься.

Может кто-то знает, куда копать?
  • Вопрос задан
  • 2749 просмотров
Пригласить эксперта
Ответы на вопрос 4
sl_bug
@sl_bug
Обычно такие вещи кладутся в отдельную таблицу (называйте это кешем или еще как-то), и не удаляйте из нее, а помечайте удаленным. Ну и шардинг для нее если совсем уж много данных.
Ответ написан
taliban
@taliban
php программист
1. Вставка на 1000 записей произойдет мгновенно, потому как вам надо не все данные хранить а лишь айдишники.
2. Поэксперементируйте с запросами:
  2а. выбрать айдишники всех друзей
  2б. выбрат по айди всех друзей (да да, как бы смешно не звучало)
  2в. выбрать активность ленты
Иногда такие 3 запросы работают быстрей чам один джойн
3. «они могут захотеть *неожиданно* посмотреть посты из френдленты с 1000 по 1010.» — забейте
4. Если сообщения не изменяемые, то нет смысла сортировать по дате, первичный числовой ключ надеюсь есть? он всегда больше у последних записей
Это все что сходу в голову пришло.
Ответ написан
Комментировать
Если боитесь заставить пользователя ждать — обрабатывать вариант 2 через очередь.
Ответ написан
Комментировать
Finom
@Finom
SQL? WTF??? NoSQL!!!11
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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