Offset проще для «страница X из Y»; cursor стабилен на больших и живых данных.
Разбор
- Offset когда: маленькие ограниченные mostly-static наборы, где нужен произвольный jump (admin-таблица, search с номерами страниц). Проще и даёт «страница X из Y».
- Cursor когда: infinite scroll, ленты, real-time или high-write данные, anything deep/large. Стабилен и быстр — default для scale.
- Цена cursor: нет random access («страница 47»), сложнее total/last page (отдельный
COUNT, сам дорогой), prev-page — reversed query. Bidirectional cursors усложняют.
- Скрытая цена offset: deep pages бьют по БД; concurrent write ломает последовательность — баг под реальным трафиком; в демо живёт, в production умирает.
Итог
Offset для admin/search с номерами; cursor для лент и high-write — и объясните, почему deep offset дорог.