ПагинацияПеред стримом решил освежить свои познания пагинации, вдруг что-то новое придумали. Но нет, по-прежнему есть два варианта: offset и keyset (иногда её ещё называют "курсорная"). Offset пагинация в немилости, потому что неэффективна на дальних страницах: при обработке запроса вида limit :page_size offset :offset база вынуждена извлечь все offset + limit строк. Keyset пагинация решает эту проблему, используя формулу where id > :previous_id limit :page_size, но зато не позволяет прыгать по страницам. Ещё она не страдает от неожиданных смещений при добавлении или удалении строк в таблице.Когда на Stack Overflow кто-то спрашивает: "А как же мне построить классическую пагинацию с циферками, используя keyset метод?", ему обычно отвечают: "А зачем? Ты можешь себе представить пользователя, который прыгает на сотую страницу? Сделай бесконечный скролл..."И тут я подумал: если пользователь редко ходит дальше условной третьей страницы, то и offset навигация будет неплохо справляться! На четвёртой странице можно ничего не выводить, а просить уточнить выборку с помощью фильтров и сортировки. Кстати, Google так и делает. В поисковике самая обыкновенная offset навигация: https://google.com/search?q=pagination&num=20&start=100, при этом из 129 млн. результатов он показывает чуть больше 200 (у меня вывел 24 страницы по 10). А вот Gmail не может себе позволить не показывать все письма, поэтому в нём реализована keyset навигация, только не с бесконечно прокруткой, а с кнопками ◀️▶️.Ориентируясь на эти два примера, выбирайте, какой подход лучше подойдёт вам в каждом конкретном случае, а мы сегодня в 19 красиво зарешаем оба варианта!