Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W aplikacjach internetowych z dużymi zbiorami danych prędzej czy później pojawia się kwestia paginacji. Wyświetlanie od razu tysięcy rekordów w tabeli czy liście to zły pomysł zarówno dla wydajności, jak i dla użytkownika. Najpopularniejsze podejścia w Rails to paginacja offsetowa oraz paginacja kursorowa. Następnie omówimy, co to jest, jakie są zalety i wady, a także zobaczymy przykłady realizacji.
Paginacja offsetowa
Co to jest
Podejście offsetowe wykorzystuje operatory SQL OFFSET i LIMIT. Mówi bazie: "Pomiń N rekordów i weź następne M".
Przykład w Rails
# Pobierz drugą stronę z 20 rekordami users = User.order(:id).offset(20).limit(20)
SQL, który zostanie wykonany:
SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 20 OFFSET 20;
Zalety
- Łatwy w realizacji.
- Dobrze integruje się z gotowymi gemami (np. kaminari, will_paginate).
- Wygodne dla użytkownika: można szybko przejść do dowolnej strony (np. strona nr 50).
Wady
- Problem z wydajnością: im większy offset, tym wolniej działa zapytanie. Baza danych i tak musi przejść N rekordów, aby je pominąć.
- Niestałość wyników: jeśli w tabeli dodawane lub usuwane są rekordy podczas przeglądania, strony "przesuwają się". Użytkownik może pominąć lub dwukrotnie zobaczyć te same dane.
Paginacja kursorowa
Co to jest
Podejście kursorowe wykorzystuje "wskaźnik" (cursor) na ostatni element poprzedniej strony. Zamiast liczyć od początku, mówimy: "Pokaż następne 20 rekordów po ID = X".
Przykład w Rails
Załóżmy, że mamy użytkowników posortowanych według id.
# Pobierz pierwsze 20 rekordów
users = User.order(:id).limit(20)
# Pobierz następne po ostatnim id
last_id = users.last.id
next_users = User.where("id > ?", last_id).order(:id).limit(20)
SQL będzie wyglądać tak:
SELECT "users".* FROM "users" WHERE (id > 20) ORDER BY "users"."id" ASC LIMIT 20;
Zalety
- Wysoka wydajność: baza nie przeszukuje tysięcy rekordów, tylko od razu skacze do odpowiedniego miejsca.
- Stabilne wyniki: przy dodawaniu lub usuwaniu rekordów kursor gwarantuje, że nie zobaczysz duplikatów ani pominięć.
Wady
- Brak "dowolnych stron". Możesz poruszać się tylko do przodu lub do tyłu.
- Trudniejsze w realizacji, szczególnie jeśli kursor musi opierać się nie na jednym polu (id), ale na złożonych warunkach sortowania.
Kiedy używać którego podejścia?
Używaj paginacji offsetowej, jeśli:
- twoje tabele są stosunkowo małe;
- ważne jest, aby mieć możliwość przejścia do konkretnej strony (np. "Strona 50");
- użytkownicy rzadko pracują z bardzo głębokimi listami.
Używaj paginacji kursorowej, jeśli:
- pracujesz z dużymi zbiorami danych;
- wydajność jest krytycznie ważna;
- wystarczą ci przyciski "Wstecz/Dalej" zamiast konkretnych numerów stron;
- potrzebna jest stabilność wyświetlania przy częstych aktualizacjach danych.
Paginacja offsetowa jest łatwiejsza do realizacji, ale jest wolna i mniej niezawodna dla dużych zbiorów danych. Paginacja kursorowa jest szybsza i bardziej stabilna, jednak ogranicza nawigację.
Wybór zależy od zadania: jeśli budujesz bloga lub katalog z tysiącami rekordów - podejście offsetowe jest odpowiednie. Jeśli jednak tworzysz API dla aplikacji mobilnej lub pracujesz z danymi, które ciągle się zmieniają (czaty, strumienie wiadomości) — wybierz kursor.
Ten post nie ma jeszcze żadnych dodatków od autora.