ЗмістНатисність на посилання, щоб перейти до потрібного місця
У веб-додатках з великими наборами даних рано чи пізно постає питання пагінації. Виводити одразу тисячі записів у таблиці чи списку - погана ідея як для продуктивності, так і для користувача. Найпоширеніші підходи в Rails - це offset pagination та cursor pagination. Далі розберемо, що це таке, які є переваги й недоліки, а також подивимось приклади реалізації.
Offset pagination
Що це таке
Offset-підхід використовує SQL-оператори OFFSET та LIMIT. Він каже базі: "Пропусти N записів і візьми наступні M".
Приклад у Rails
# Отримати другу сторінку з 20 записами users = User.order(:id).offset(20).limit(20)
SQL, який виконається:
SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 20 OFFSET 20;
Переваги
- Простий у реалізації.
- Добре інтегрується з готовими гемами (наприклад, kaminari, will_paginate).
- Зручно для користувача: можна швидко перейти на будь-яку сторінку (наприклад, сторінка №50).
Недоліки
- Проблема продуктивності: чим більший offset, тим повільніше працює запит. БД все одно повинна пройти N записів, щоб пропустити їх.
- Нестабільність результатів: якщо у таблиці додаються або видаляються записи під час перегляду, сторінки "з’їжджають". Користувач може пропустити чи двічі побачити ті самі дані.
Cursor pagination
Що це таке
Cursor-підхід використовує "вказівник" (cursor) на останній елемент попередньої сторінки. Замість того, щоб рахувати від початку, ми кажемо: "Покажи наступні 20 записів після ID = X".
Приклад у Rails
Припустимо, у нас є користувачі відсортовані за id.
# Отримати перші 20 записів users = User.order(:id).limit(20) # Отримати наступні після останнього id last_id = users.last.id next_users = User.where("id > ?", last_id).order(:id).limit(20)
SQL виглядатиме так:
SELECT "users".* FROM "users" WHERE (id > 20) ORDER BY "users"."id" ASC LIMIT 20;
Переваги
- Висока продуктивність: база не проходить тисячі записів для пошуку, а одразу стрибає на потрібне місце.
- Стабільні результати: при додаванні чи видаленні записів курсор гарантує, що ви не побачите дублікати чи пропуски.
Недоліки
- Немає "довільних сторінок". Ви можете рухатися лише вперед або назад.
- Складніше в реалізації, особливо якщо курсор повинен базуватися не на одному полі (id), а на складних умовах сортування.
Коли використовувати який підхід?
Використовуйте offset pagination, якщо:
- ваші таблиці відносно невеликі;
- важливо мати можливість переходу на конкретну сторінку (наприклад, "Сторінка 50");
- користувачі рідко працюють з дуже глибокими списками.
Використовуйте cursor pagination, якщо:
- ви працюєте з великими обсягами даних;
- продуктивність критично важлива;
- вам достатньо кнопок "Назад/Далі" замість конкретних номерів сторінок;
- потрібна стабільність відображення при частих оновленнях даних.
Offset-pagination простіше реалізувати, але вона повільна та менш надійна для великих обсягів даних. Cursor-pagination швидша й стабільніша, проте обмежує навігацію.
Вибір залежить від задачі: якщо ви будуєте блог чи каталог з тисячами записів - offset підходить. Якщо ж створюєте API для мобільного застосунку або працюєте з даними, що постійно змінюються (чати, стрічки новин) — обирайте cursor.
Цей допис поки що не має жодних доповнень від автора/ки.