2016-05-04 10 views
1

Ich bin neu in Cassandra und versuchen, ein Datenmodell für das Messaging-System aufzubauen. Ich habe nur wenige Lösungen gefunden, aber keine von ihnen entspricht genau meinen Anforderungen. Es gibt zwei wichtigsten Anforderungen:Design-Datenmodell für Messaging-System mit Cassandra

  1. Hier finden Sie eine Liste der letzten Meldungen für einen bestimmten Benutzer, von allen anderen Benutzern, sortiert nach Zeit.
  2. Hier erhalten Sie eine Liste der Nachrichten für die persönliche Nachrichtenhistorie, sortiert nach Zeit.

ich von so etwas wie dies dachte,

CREATE TABLE chat (
    to_user text, 
    from_user_text, 
    time text, 
    msg text, 
    PRIMARY KEY((to_user,from_user),time) 
) WITH CLUSTERING ORDER BY (time DESC); 

Aber dieser Entwurf einige Probleme hat, wie ich in der Lage sein würde nicht erste Anforderung da diese Konstruktion erfordert passieren Von_Nutzer auch gerecht zu werden. Und dies wäre auch ineffizient, wenn die Anzahl der (to_user, from_user) Paar erhöht.

Antwort

1

Sie haben Recht. Diese eine Tabelle wird nicht beide Abfragen erfüllen, so dass Sie zwei Tabellen benötigen. Eine für jede Abfrage. Dies ist ein Kernkonzept mit Cassandra Datenmodellierung. Abfragegesteuertes Design

So ist die Abfrage von Nachrichten an einen Benutzer suchen:

CREATE TABLE chat (
    to_user text, 
    from_user_text, 
    time text, 
    msg text, 
    PRIMARY KEY((to_user),time) 
) WITH CLUSTERING ORDER BY (time DESC); 

Nachrichten von einem Benutzer an einem anderen Benutzer.

CREATE TABLE chat (
    to_user text, 
    from_user_text, 
    time text, 
    msg text, 
    PRIMARY KEY((to_user),from_user,time) 
) WITH CLUSTERING ORDER BY (time DESC); 

Geringfügiger Unterschied zu Ihrem: from_user ist eine Clustering-Spalte und kein Teil des Partitionsschlüssels. Dies minimiert die Anzahl der im Anwendungscode benötigten Auswahlabfragen.

Es ist möglich, die zweite Tabelle zu verwenden, um beide Abfragen zu erfüllen, aber Sie müssen den 'from_user' angeben, um eine Bereichsabfrage pünktlich zu verwenden.

+0

Vielen Dank für Ihre Antwort. Es wird meine beiden Anforderungen erfüllen. Aber die erste Tabelle gibt mir alle Nachrichten von allen from_users sortiert nach Zeit, das heißt, ich werde nicht in der Lage sein, Nachrichten eindeutig von verschiedenen from_users zu bekommen. Gibt es einen Weg, das zu erreichen? –

+0

Die zweite Tabelle kann das tun. 'Wählen * aus dem Chat where to_user =' X 'und from_user =' Y '; –

+0

Ich möchte nach allen Benutzern suchen, nicht nur from_user = Y. Wie bei einem FB-Messenger wird nur die letzte Nachricht aller from_users angezeigt, jedoch in zeitlicher Reihenfolge. –