Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Offset vs Cursor Pagination w Rails: co wybrać i dlaczego

Okładka posta: Offset vs Cursor Pagination w Rails: co wybrać i dlaczego
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.

Co to jest przepełnienie całkowite?
15 sie 08:28

Co to jest przepełnienie całkowite?

meme code
meme code@memecode
Co to jest plik HAR (HTTP Archive)?
25 sie 18:23

Co to jest plik HAR (HTTP Archive)?

meme code
meme code@memecode
Czym jest Bubble Sort (wyjaśnienie algorytmu)?
16 wrz 18:42

Czym jest Bubble Sort (wyjaśnienie algorytmu)?

meme code
meme code@memecode
Czym jest wzrost eksponencjalny?
16 wrz 18:57

Czym jest wzrost eksponencjalny?

meme code
meme code@memecode
Czym jest złożoność faktorialna?
16 wrz 19:03

Czym jest złożoność faktorialna?

meme code
meme code@memecode
Czym jest NP-trudność?
16 wrz 19:31

Czym jest NP-trudność?

meme code
meme code@memecode
Czym jest Row Security w PostgreSQL i po co jest to deweloperom Rails?
4 paź 19:06

Czym jest Row Security w PostgreSQL i po co jest to deweloperom Rails?

meme code
meme code@memecode
Czym jest ivar w Ruby / Rails?
19 paź 20:12

Czym jest ivar w Ruby / Rails?

meme code
meme code@memecode
Podstawowe metody uwierzytelniania w API
19 paź 20:26

Podstawowe metody uwierzytelniania w API

meme code
meme code@memecode
Czym różni się OAuth 1 od OAuth 2
19 paź 20:34

Czym różni się OAuth 1 od OAuth 2

meme code
meme code@memecode
Czym jest ORM i po co jest potrzebny?
26 paź 14:00

Czym jest ORM i po co jest potrzebny?

meme code
meme code@memecode
MCP: nowy internet, gdzie strony komunikują się z AI
4 lis 11:43

MCP: nowy internet, gdzie strony komunikują się z AI

meme code
meme code@memecode