~/home of geeks

Deterministische Reihenfolgen

· 179 Wörter · 1 Minute(n) Lesedauer

Größere Datenmengen werden gerne tabellarisch dargestellt, mit den Optionen seitenweise zu blättern (Paging) und nach bestimmten Attributen (Spalten) zu sortieren. Letztens ist mir aufgefallen, dass dies häufig nicht richtig gemacht wird.

Meistens werden die Daten aus einer SQL-Datenbank selektiert. Ein Beispiel hierfür wäre eine Darstellung von jeweils 25 Datensätzen, in diesem Fall sortiert nach dem Datum der letzten Änderung, und davon die zweite Seite (Offset 1):

SELECT my_entities ORDER BY last_modify_date DESC LIMIT 25 OFFSET 1

Ist die Reihenfolge der Daten nun immer gleich? Nein, denn sollten zwei Datensätze zur gleichen Zeit geändert worden sein, so haben sie den gleichen Wert für last_modify_date. Da keine weiteren Sortierkriterien angegeben sind, würde es der Datenbank überlassen werden, in welcher Reihenfolge sie uns die beiden Datensätze liefert und damit eine uns unbekannte (und dadurch eher zufällige) Reihenfolge erzeugt.

Je mehr Datensätze mit dem gleichen Attribut existieren, desto wahrscheinlicher wird ein “Springen” der Datensätze.

Abhilfe schafft hier die Ergänzung eines weiteren Sortierkriteriums, welches eine eindeutige Spalte, z. B. den Primärschlüssel, benutzt:

SELECT my_entities ORDER BY last_modify_date DESC, id DESC LIMIT 25 OFFSET 1