@Vadim1899

Как бороться с дублирующимися постами при lazy load пагинации?

На сайте имеется lazy load пагинация - когда скролл внизу страницы, подгружаем 20 комментариев.
Реализовано это так:
1. Браузер детектит что пользователь дошел до конца страницы и отправляет запрос getComments с параметром pageNum: n + 1, где n - текущая страница
2. Бэк на php делает запрос к бд с limit 20 и offset 20 * pageNum
3. Бэк возвращает посты в json

Но тут столкнулся со следующими потенциальными проблемами:
1. Например пользователь 1 листал комменты 2 минуты, он на pageNum = 5. За это время другой пользователь 2 удалил свой коммент (который уже показался пользователю 1). Тогда при подгрузке следующей партии комментов, они будут выводиться со сдвигом 1 (limit 20 и offset 20 * pageNum), что приведет к тому, что "комментарий на стыке" не попадет в ленту пользователя
2. За эти две минуты другие пользователи могли добавить N комментариев (сортировка комментов по убыванию - сначала новые, потом старые). Тогда сдвиг также будет N, что приведет к тому, что в ленте у пользователя N комментариев продублируется.

В голову приходит только одно - проверять дубликаты на фронте и удалять их. Но тогда за одну подгрузку комментариев мы не получим ровно 20 комментариев, а можем получить меньше, что не есть хорошо. Да и первый кейс это вариант не решает

Более чем уверен, что есть проверенный алгоритм для решения подобных проблем, но как не гуглил - гугл меня не понимает

UPD в голову пришло еще на бэк передавать id последнего комментария, и при запросе в бд добавить условие по типу WHERE id < lastCommentId, но это также не решает первую проблему
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
а ты не удаляй комменты полностью, добавь поле state (1 - активный, 0 - скрытый и условие) и WHERE state = 1
Ответ написан
Комментировать
vabka
@vabka Куратор тега Веб-разработка
Токсичный шарпист
Бэк на php делает запрос к бд с limit 20 и offset 20 * pageNum

Добавь параметр, с какого поста начинать пагинацию. Например дату.
Тогда из-за новых постов съезжать ничего не будет.

Но тут столкнулся со следующими потенциальными проблемами:
1. Например пользователь 1 листал комменты 2 минуты, он на pageNum = 5. За это время другой пользователь 2 удалил свой коммент (который уже показался пользователю 1). Тогда при подгрузке следующей партии комментов, они будут выводиться со сдвигом 1 (limit 20 и offset 20 * pageNum), что приведет к тому, что "комментарий на стыке" не попадет в ленту пользователя
2. За эти две минуты другие пользователи могли добавить N комментариев (сортировка комментов по убыванию - сначала новые, потом старые). Тогда сдвиг также будет N, что приведет к тому, что в ленте у пользователя N комментариев продублируется.

Как сказали выше - вместо полного удаления, просто помечай их как удалённые.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы