← StartseiteProgrammierung (Програмування)

Offset vs Cursor Pagination in Rails: was wählen und warum

In Webanwendungen mit großen Datensätzen stellt sich früher oder später die Frage der Paginierung. Tausende von Einträgen in einer Tabelle oder Liste auf einmal anzuzeigen, ist sowohl für die Leistung als auch für den...

InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
In Webanwendungen mit großen Datensätzen stellt sich früher oder später die Frage der Paginierung. Tausende von Einträgen in einer Tabelle oder Liste auf einmal anzuzeigen, ist sowohl für die Leistung als auch für den Benutzer eine schlechte Idee. Die gängigsten Ansätze in Rails sind Offset-Paginierung und Cursor-Paginierung. Im Folgenden werden wir erläutern, was das ist, welche Vor- und Nachteile es gibt, und Beispiele für die Implementierung ansehen.

Offset-Paginierung

Was ist das?
Der Offset-Ansatz verwendet die SQL-Befehle OFFSET und LIMIT. Er sagt der Datenbank: "Überspringe N Einträge und nimm die nächsten M".
Beispiel in Rails
# Die zweite Seite mit 20 Einträgen abrufen
users = User.order(:id).offset(20).limit(20)
Der SQL-Befehl, der ausgeführt wird:
SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 20 OFFSET 20;
Vorteile
  • Einfach zu implementieren.
  • Lässt sich gut mit bestehenden Gems integrieren (z. B. kaminari, will_paginate).
  • Benutzerfreundlich: Man kann schnell zu jeder Seite wechseln (z. B. Seite Nr. 50).
Nachteile
  • Leistungsprobleme: Je größer der Offset, desto langsamer wird die Abfrage. Die DB muss trotzdem N Einträge durchlaufen, um sie zu überspringen.
  • Instabilität der Ergebnisse: Wenn während der Ansicht Einträge in der Tabelle hinzugefügt oder gelöscht werden, "verschieben" sich die Seiten. Der Benutzer kann die gleichen Daten überspringen oder doppelt sehen.

Cursor-Paginierung

Was ist das?
Der Cursor-Ansatz verwendet einen "Zeiger" (Cursor) auf das letzte Element der vorherigen Seite. Anstatt vom Anfang zu zählen, sagen wir: "Zeige die nächsten 20 Einträge nach ID = X".
Beispiel in Rails
Angenommen, wir haben Benutzer, die nach ID sortiert sind.
# Die ersten 20 Einträge abrufen
users = User.order(:id).limit(20)

# Die nächsten nach der letzten ID abrufen
last_id = users.last.id
next_users = User.where("id > ?", last_id).order(:id).limit(20)
Der SQL-Befehl sieht so aus:
SELECT "users".* FROM "users" WHERE (id > 20) ORDER BY "users"."id" ASC LIMIT 20;
Vorteile
  • Hohe Leistung: Die Datenbank durchläuft nicht Tausende von Einträgen zur Suche, sondern springt sofort an die richtige Stelle.
  • Stabile Ergebnisse: Bei Hinzufügungen oder Löschungen von Einträgen garantiert der Cursor, dass Sie keine Duplikate oder Überspringungen sehen.
Nachteile
  • Keine "willkürlichen Seiten". Sie können nur vorwärts oder rückwärts navigieren.
  • Schwieriger zu implementieren, insbesondere wenn der Cursor nicht auf einem Feld (ID) basieren, sondern auf komplexen Sortierbedingungen beruhen muss.

Wann welchen Ansatz verwenden?

Verwenden Sie Offset-Paginierung, wenn:
  • Ihre Tabellen relativ klein sind;
  • es wichtig ist, zu einer bestimmten Seite wechseln zu können (z. B. "Seite 50");
  • Benutzer selten mit sehr tiefen Listen arbeiten.
Verwenden Sie Cursor-Paginierung, wenn:
  • Sie mit großen Datenmengen arbeiten;
  • Leistung von entscheidender Bedeutung ist;
  • Sie mit "Zurück/Vorwärts"-Buttons anstelle von spezifischen Seitenzahlen auskommen;
  • Stabilität der Anzeige bei häufigen Datenaktualisierungen erforderlich ist.
Offset-Paginierung ist einfacher zu implementieren, aber sie ist langsam und weniger zuverlässig bei großen Datenmengen. Cursor-Paginierung ist schneller und stabiler, schränkt jedoch die Navigation ein.
Die Wahl hängt von der Aufgabe ab: Wenn Sie einen Blog oder ein Verzeichnis mit Tausenden von Einträgen erstellen, ist Offset geeignet. Wenn Sie jedoch eine API für eine mobile Anwendung erstellen oder mit sich ständig ändernden Daten arbeiten (Chats, Nachrichtenfeeds) – wählen Sie Cursor.

🔥 Weitere Beiträge

Alle Beiträge
Was ist ein Integer-Overflow?
Programmierung (Програмування)15. Aug '25, 08:28 Uhr

Was ist ein Integer-Overflow?

Sie haben einen Zähler, der nur bis zu einer bestimmten Zahl zählen kann. Zum Beispiel ein Tasche...

Was ist eine HAR-Datei (HTTP-Archiv)?
Programmierung (Програмування)25. Aug '25, 18:23 Uhr

Was ist eine HAR-Datei (HTTP-Archiv)?

HAR-Datei (HTTArchiv) - ist ein spezielles Dateiformat .har, in dem das Protokoll der Interaktion...

Was ist faktoriale Komplexität?
Programmierung (Програмування)16. Sep '25, 19:03 Uhr

Was ist faktoriale Komplexität?

Fakultative Komplexität - ist eine Situation, in der die Anzahl der Varianten oder Kombinationen ...

Was ist NP-Komplexität?
Programmierung (Програмування)16. Sep '25, 19:31 Uhr

Was ist NP-Komplexität?

NP-Schwierigkeit - ist eine Klasse von Aufgaben, für die es sehr schwierig ist, eine Lösung zu fi...

Was ist ivar in Ruby / Rails?
Programmierung (Програмування)19. Okt '25, 20:12 Uhr

Was ist ivar in Ruby / Rails?

ivar - ist eine Abkürzung für instance variable (Instanzvariable). In Ruby wird sie mit @ vor dem...

Was unterscheidet OAuth 1 von OAuth 2
Programmierung (Програмування)19. Okt '25, 20:34 Uhr

Was unterscheidet OAuth 1 von OAuth 2

OAuth 1 OAuth 1 wurde Anfang der 2000er Jahre als Methode zur sicheren Zugriffsgewährung für Drit...

Was ist ORM und wozu wird es benötigt?
Programmierung (Програмування)26. Okt '25, 14:00 Uhr

Was ist ORM und wozu wird es benötigt?

Wenn wir mit Datenbanken arbeiten, müssen wir normalerweise SQL-Abfragen schreiben - Abfragen, Ei...