2016-04-02 17 views
0

Ich schreibe Messaging-Chat-System, ähnlich wie FB Messaging. Ich habe den Weg nicht gefunden, wie man die Konversationsliste effektiv speichert (jede Zeile hat einen anderen Benutzer mit der zuletzt gesendeten Nachricht, die zuletzt oben ist). Wenn ich Gespräche aus dieser Tabelle Liste:Cassandra cql - Sortieren von eindeutigen IDs nach Zeit

CREATE TABLE "conversation_list" (
    "user_id" int, 
    "partner_user_id" int, 
    "last_message_time" time, 
    "last_message_text" text, 
    PRIMARY KEY ("user_id", "partner_user_id") 
) 

kann ich aus dieser Tabelle Gesprächen wählt für jeden User_id. Wenn eine neue Nachricht gesendet wird, können wir einfach die Zeile aktualisieren:

UPDATE conversation_list SET last_message_time = '...', last_message_text='...' WHERE user_id = '...' AND partner_user_id = '...' 

Aber es ist natürlich nach Clustering-Schlüssel sortiert. Meine Frage: Wie erstellt man eine Liste von Konversationen, die nach last_message_time sortiert ist, aber partner_user_id wird für eine gegebene user_id eindeutig sein?

Wenn last_message_time Clustering-Schlüssel ist und wir die Zeile löschen und neue einfügen (um partner_user_id eindeutig zu halten), werde ich viele so viele Thumbstones in der Tabelle haben.

Vielen Dank.

Antwort

2

Eine leichte Änderung Ihrer ursprünglichen Modell sollte das tun, was Sie wollen:

CREATE TABLE conversation_list (
    user_id int, 
    partner_user_id int, 
    last_message_time timestamp, 
    last_message_text text, 
    PRIMARY KEY ((user_id, partner_user_id), last_message_time) 
) WITH CLUSTERING ORDER BY (last_message_time DESC); 

I kombiniert "User_id" und "partner_user_id" in einer Partition Schlüssel. "last_message_time" kann die einzelne Clusterspalte sein und Sortierung bereitstellen. Ich habe die Standardsortierreihenfolge mit CLUSTERING ORDER BY umgekehrt, um die Zeitstempel absteigend zu machen. Jetzt sollten Sie in der Lage sein, einfach jedes Mal einzufügen, wenn eine Nachricht von einem Benutzer an eine Partner-ID gesendet wird.

Die Option Jetzt auswählen gibt Ihnen die Möglichkeit, nach der zuletzt gesendeten Nachricht zu suchen. Gefällt mir:

SELECT last_message_time, last_message_text 
FROM conversation_list 
WHERE user_id= ? AND partner_user_id = ? 
LIMIT 1 
+0

Danke Patrick! Vielleicht habe ich es nicht gut beschrieben. Ich weiß, wie man den Chat (1 Konversation) verwaltet. Aber ich brauche eine Liste aller Kontakte mit der letzten Nachricht. Dann können Benutzer eine Konversation (Chat) auswählen und öffnen. Ich muss eine ** Liste der Benutzer (Kontakte) erhalten, geordnet nach der Uhrzeit der letzten Nachricht **. –

+0

Ist das aus der Sicht eines Benutzers oder eines Chats? –

+0

Ich möchte die letzten Konversationen wie Facebook auflisten, wenn Sie auf das Nachrichtensymbol oben klicken. Sie können die letzten X Konversationen nach Zeit sortiert (älter oben) sehen, eine Zeile für jede Konversation (auch wenn es mehr Nachrichten gibt). Nachdem Sie auf eine Konversation in der Liste geklickt haben, öffnen Sie den One-One-Chat mit dem aktuellen Benutzer (was einfach zu tun ist). –