У меня есть куча постов, хранящихся в базе данных в бэкэнде, и мне нужен внешний интерфейс для их отложенной загрузки, когда пользователь прокручивает страницу вниз.
Наивное решение было бы примерно таким: это указывается в бэкэнде при каждом запросе дополнительных сообщений
SELECT * FROM posts ORDER BY votes desc OFFSET {numberOfAlreadyLoadedPosts} LIMIT {numberOfPostsToLoad}
Однако существует очевидная проблема, заключающаяся в том, что при достаточном изменении количества голосов за сообщения между двумя запросами сообщение может появляться дважды или не появляться вовсе.
Например, изначально мы запрашиваем две верхние записи
- Пост 1: 10 голосов
- Пост 2: 8 голосов
Затем пользователь прокручивает, но в то же время происходят следующие изменения:
- Сообщение 3: 6 голосов => 11 голосов
Теперь, когда будет запрошено следующее сообщение, мы будем получите пост 2 снова, потому что это будет 3-й топ пост сейчас. И пост 3. просто никогда не появится для пользователя.
Как лучше всего обойтись без повторного запроса всех постов каждый раз?