Cassandra: 10 zuletzt geänderte Datensätze auflisten
Ich habe Probleme, meine Daten so zu modellieren, dass ich Cassandra effizient nach den letzten 10 (tatsächlich beliebig vielen) Datensätzen abfragen kann, die zuletzt geändert wurden. Jeder Datensatz hat eine last_modified_date-Spalte, die von der Anwendung beim Einfügen / Aktualisieren des Datensatzes festgelegt wird.
Ich habe die Datenspalten aus diesem Beispielcode ausgeschlossen.
Hauptdatentabelle (enthält nur eine Zeile pro Datensatz):
CREATE TABLE record (
record_id int,
last_modified_by text,
last_modified_date timestamp,
PRIMARY KEY (record_id)
);
Lösung 1 (Fehlgeschlagen)Ich habe versucht, eine separate Tabelle zu erstellen, die eine Clustering-Schlüsselreihenfolge verwendet.
Tabelle (eine Zeile für jeden Datensatz; nur das Datum der letzten Änderung wird eingefügt):
CREATE TABLE record_by_last_modified_index (
record_id int,
last_modified_by text,
last_modified_date timestamp,
PRIMARY KEY (record_id, last_modified_date)
) WITH CLUSTERING ORDER BY (last_modified_date DESC);
Abfrage
SELECT * FROM record_by_last_modified_index LIMIT 10
Diese Lösung funktioniert nicht, da die Clusterreihenfolge nur für die Reihenfolge von Datensätzen mit demselben Partitionsschlüssel gilt. Da jede Zeile einen anderen Partitionsschlüssel (record_id) hat, enthalten die Abfrageergebnisse nicht die erwarteten Datensätze.
Lösung 2 (ineffizient)Eine andere Lösung, die ich versucht habe, besteht darin, Cassandra einfach nach allen record_id- und last_modified_date-Werten abzufragen, sie zu sortieren und die ersten 10 Datensätze in meiner Anwendung auszuwählen. Dies ist eindeutig ineffizient und lässt sich nicht gut skalieren.
Lösung 3Eine letzte Lösung, die ich in Betracht gezogen habe, ist die Verwendung des gleichen Partitionsschlüssels für alle Datensätze und die Verwendung der Clusterreihenfolge, um sicherzustellen, dass die Datensätze richtig sortiert sind. Das Problem bei dieser Lösung ist, dass die Daten nicht korrekt auf die Knoten verteilt werden, da alle Datensätze denselben Partitionsschlüssel haben würden. Das kommt mir wie ein Nichtstarter vor.