Выбор ответа Middle Проектирование API обновлено

Дубли при offset-пагинации

Вопрос

Лента новостей отдаётся через ?limit=20&offset=N, сортировка от новых к старым. Пользователь листает, и иногда видит одну и ту же новость на двух страницах подряд. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Между запросами появились новые записи, и строки на границе страниц сдвинулись. Offset считает позицию от начала выборки.

Варианты ответа

  1. Между запросами появились новые записи, и строки на границе страниц сдвинулисьправильный ответ
  2. База данных не гарантирует уникальность строк при сортировке по дате создания
  3. Браузер закешировал предыдущую страницу и подставил её кусок в новый ответ
  4. Для пагинации нужно было использовать PUT вместо GET, чтобы сервер держал позицию

Разбор

Offset считает позицию от начала выборки. Новая запись в начале сдвигает всё, и последний элемент страницы 1 становится первым на странице 2. Cursor-пагинация отсчитывает от конкретного элемента и этого избегает. Уникальность строк тут ни при чём. Кеш вернул бы ту же страницу целиком, а не одну повторившуюся запись. Метод на это не влияет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.