2016-08-07 8 views
0

Ich habe eine Tabelle mit Nachrichten. Nennen wir diese Tabelle news. Eine Gruppe von Benutzern fügt fortlaufend neue Zeilen in news ein. Ein Benutzer, der gerade den Newsfeed durchsucht (Daten aus der Tabelle). Wie kann ich die Paginierung konsistent machen, wenn man bedenkt, dass während ein Benutzer beispielsweise auf der ersten Seite surft, andere Benutzer mehr Daten darin einfügen. Also, wenn die erste Seite hatte, sagen wir 18 Nachrichten, dann muss ich OFFSET 18 verwenden, aber in diesem Fall werde ich falsche Daten abrufen, weil neue Nachrichten bereits eingefügt wurden.Postgres: dynamische Offset

Wie implementiere ich die Paginierung richtig?

+0

Ist die Paginierung nach Zeitstempel der Nachrichteneinfügung geordnet? Hat die Reihe eine eindeutige ID? –

+0

@ClodoaldoNeto, Zeilen haben sowohl UID- als auch Insertionszeitstempel. Sollte ich die Paginierung auf dem Einfüge-Zeitstempel statt auf dem Offset basieren lassen? Ich bin mir nicht sicher, ist es möglich, mehr als eine Zeile mit einem eindeutigen Zeitstempel zu haben? Ich meine, wenn es in einer einzigen Tabelle ist, kann pg schneller als eine Zeile pro ms einfügen? – stkvtflw

Antwort

1

Füllen Sie den neuesten und ältesten Zeilen-Zeitstempel der Seite im Anwendungs-Client. Wenn es sich um eine Web-App ist dann die next und previous Links wäre so etwas wie:

<a href="/news?newest=2016-08-06+20%3A17%3A05.882252%2B00">Previous</a> 
<a href="/news?oldest=2016-08-05+20%3A17%3A05.882252%2B00">Next</a> 

dann den Wert des einen kommt man vom Client auf die Abfrage erhalten und die andere als null:

(
    select * 
    from (
     select * 
     from news 
     where ts > :newest 
     order by ts 
     limit 20 
    ) s 
    order by ts desc 
) 
union all 
(
    select * 
    from news 
    where ts < :oldest 
    order by ts desc 
    limit 20 
) 

Es ist sehr unwahrscheinlich, dass zwei Insertionen in der gleichen Millisekunde passieren würden.

+0

Ich benutze GUID v4, so dass der '>' Operator nicht anwendbar ist. – stkvtflw

+0

@stkvtflw Fehler behoben –