Лениво загружать элемент из базы данных отсортированным образом, избегая пропуска или дублирования условий гонки. - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть куча постов, хранящихся в базе данных в бэкэнде, и мне нужен внешний интерфейс для их отложенной загрузки, когда пользователь прокручивает страницу вниз.

Наивное решение было бы примерно таким: это указывается в бэкэнде при каждом запросе дополнительных сообщений

SELECT * FROM posts ORDER BY votes desc OFFSET {numberOfAlreadyLoadedPosts} LIMIT {numberOfPostsToLoad}

Однако существует очевидная проблема, заключающаяся в том, что при достаточном изменении количества голосов за сообщения между двумя запросами сообщение может появляться дважды или не появляться вовсе.

Например, изначально мы запрашиваем две верхние записи

  • Пост 1: 10 голосов
  • Пост 2: 8 голосов

Затем пользователь прокручивает, но в то же время происходят следующие изменения:

  • Сообщение 3: 6 голосов => 11 голосов

Теперь, когда будет запрошено следующее сообщение, мы будем получите пост 2 снова, потому что это будет 3-й топ пост сейчас. И пост 3. просто никогда не появится для пользователя.

Как лучше всего обойтись без повторного запроса всех постов каждый раз?

...