2016-12-16 1 views
2

Ich brauche eine Liste von N Benutzern mit den neuesten Aktionen mit Cassandra.Cassandra 2.1: Wie modelliere ich für die zuletzt aktiven Benutzer?

Ich habe versucht, das folgende Schema zu verwenden:

CREATE TABLE user_actions(
    partition_key int, 
    username int, 
    action_time timestamp, 
PRIMARY KEY(partition_key, action_time) 
WITH CLUSTERING ORDER BY(action_time DESC); 

Wenn ein Benutzer zum ersten Mal in ihm einen neuen Eintrag erstellt. Ich kann die start_time-Eigenschaft jedoch nicht aktualisieren, da sie als Clusterschlüssel verwendet wird. I könnte die alten Daten löschen und einen neuen Eintrag erstellen, wenn der Benutzer eine andere Aktion ausführt - aber Benutzeraktionen treten häufig auf und wir werden schnell die Tombstone-Grenze erreichen.

Weiß jemand, wie ich die Daten am besten modellieren könnte, um dies zu erreichen?

Antwort

4

Sie müssen keine einzelnen Zellen löschen. Einfach anhängen. Fügen Sie eine weitere Komponente auf die Partition Schlüssel, um zu verhindern zu breit bekommen:

PRIMARY KEY((partition_key, day), action_time) 

Dann Abfrage mit so etwas wie (Pseudo-Code):

y = floor(time()/(60 * 60 * 24)) 
oldest_possible = y - 7 
r = [] 
while len(r) < N and y >= oldest_possible: 
    R.append(query('SELECT * FROM user_actions where partition_key = {x} AND day = {y} LIMIT {N};', x, y, N) 
    y -= 1 

die letzten N Benutzer zu erhalten. Wenn es in der Partition kein N gibt, dekrementiere den Tag um 1 und frage das auch ab. Setzen Sie TTL auf 1 bis 5 Tage oder etwas und alte Aufzeichnungen werden verdichtet. Dies setzt voraus, dass Sie innerhalb von 24 Stunden mindestens N Aktionen haben, ansonsten erhalten Sie möglicherweise eine nicht vollständige Liste. Wenn Ihre Aufzeichnungen sehr aktiv sind, können Sie anstelle des Tages hour verwenden.

Die Tag/Stunde Komponente kann nur eine einfache sein floor(time()/(60*60*24))

+0

Dank Chris - ich habe dies voraus gegangen und umgesetzt. Es gibt jedoch ein Problem: Die Abfrage gibt Duplikate zurück. Während ich diese Duplikate in meiner Anwendung herausfiltern kann, habe ich mich gefragt, ob es einen Weg gibt, der diese Duplikate nicht erzeugt. – cscan

+0

Filterung ist wahrscheinlich die einfachste Option. In diesem Fall möchten Sie wahrscheinlich das LIMIT aus der Abfrage entfernen. Das Treiber-Abruflimit wird das Paging durch die Partition für Sie übernehmen. Es könnte jedoch einige schlechte Schlimmeszenarien einführen. Sie können möglicherweise ein: '((partition_key, day), username)', das nur die letzte action_time für jeden Benutzer speichert, und behalten top N von iterating dies. Ich würde erwarten, dass es schlimmer wird, aber es kann wirklich davon abhängen, wie viele Benutzer aktiv sind. Wenn Sie nur wenige aktive Benutzer am Tag haben, die viel tun, müsste das ursprüngliche Modell mehr durchgehen als andere –

Verwandte Themen