Я реализую RESTful API, который выставляет заказы как ресурс и поддерживает пагинацию через набор результатов:
GET /orders?start=1&end=30
где заказы для пагинации сортируются по ordered_at
timestamp, по убыванию. Это в основном подход #1 из вопроса SO Pagination in a REST web application.
Если пользователь запрашивает вторую страницу заказов (GET /orders?start=31&end=60
), сервер просто повторно запрашивает таблицу заказов, снова сортирует по ordered_at DESC
и возвращает записи в позициях с 31 по 60.
Проблема, с которой я столкнулся: что произойдет, если набор результатов изменится (например, будет добавлен новый заказ), пока пользователь просматривает записи? В случае добавления нового заказа пользователь увидит старый заказ №30 на первой позиции на второй странице результатов (потому что тот же заказ теперь №31). Хуже того, в случае удаления пользователь увидит старый заказ №32 на первой позиции на второй странице (№31) и вообще не увидит старый заказ №31 (теперь №30).
Я не вижу решения этой проблемы, если каким-то образом не сделать RESTful сервер stateful (urg) или не встроить некоторый интеллект пагинации в каждого клиента... Какие есть устоявшиеся методы решения этой проблемы?
Для полноты картины: мой back-end реализован на Scala/Spray/Squeryl/Postgres; я создаю два front-end клиента, один на backbone.js, а другой на Python Django.