2017-02-15 7 views
0

Ich versuche, das beste Datenmodell zu finden, um eine sehr große MySQL-Tabelle in Cassandra anzupassen. Diese Tabelle ist wie folgt strukturiert:Cassandra, wie man eine große Tabelle dynamisch filtert und aktualisiert?

CREATE TABLE big_table (
    social_id, 
    remote_id, 
    timestamp, 
    visibility, 
    type, 
    title, 
    description, 
    other_field, 
    other_field, 
    ... 
) 

Eine Seite (die hier nicht ist) kann viele socials enthalten, die viele remote_ids enthalten.

Social_id ist der Partitionierungsschlüssel, remote_id und Zeitstempel sind der Clusterschlüssel: "Remote_id" gibt Unicity, "Time" wird verwendet, um die Ergebnisse zu ordnen. So weit, ist es gut.

Das Problem ist, dass Benutzer auch auf ihren Seiteninhalt suchen können, Filtern nach einem oder mehreren sozialen Netzwerken, einer oder mehreren Arten, Sichtbarkeit (könnte 0,1,2 sein), eine Reihe von Daten oder gar nichts. Darüber hinaus sollten Benutzer basierend auf den Filtern Sichtbarkeit festlegen können.

Ich habe versucht, diesen Fall zu behandeln, aber ich kann wirklich eine nachhaltige Lösung finden. Das Beste, was ich habe, ist, eine weitere Tabelle zu erstellen, die ich mit der Originalversion mithalten muss. Diese Tabelle hat:

  • page_id: Partitionsschlüssel
  • Zeitstempel, social_id, Typen, remote_id: Clustering-Schlüssel

Plus, für jede Kombination von Filtern eine materialisierte Ansicht erstellen, das ist Wahnsinn .

Kann ich vermeiden, die zweite Tabelle zu erstellen? Was wäre in diesem Fall das beste Cassandra-Modell? Sollte ich über einen Wechsel zu anderen Technologien nachdenken?

Antwort

0

Ich fange von den letzten Fragen an.

> Was wäre das beste Cassandra Modell in diesem Fall?

Wie in Cassandra: The Definitive Guide, 2nd edition angegeben (die ich vor der Wahl oder mit Cassandra sehr zu lesen empfehlen),

In Cassandra Sie nicht mit dem Datenmodell beginnen; beginnen Sie mit dem Abfragemodell.

Sie können ein verfügbares Kapitel über Datenentwurf unter Safaribooksonline.com lesen. Cassandra möchte, dass Sie nur über Abfragen nachdenken und sich nicht um die Normalisierung kümmern.

So ist die Antwort auf

> Kann ich vermeiden, dass die zweite Tabelle erstellen?

ist Sie sollten es nicht vermeiden.

> Sollte ich einen Wechsel zu anderen Technologien in Betracht ziehen?

Das hängt davon ab, was Sie in Bezug auf Replikation und Partitionierung benötigen. Möglicherweise erstellen Sie eine Master-Master-Synchronisation basierend auf RDBMS oder etwas anderem.In Cassandra erhalten Sie doppelte Daten zwischen den Tabellen, und das ist völlig normal. Sie tauschen Speicherplatz im Austausch gegen Lese-/Schreibgeschwindigkeit.

> Wie filtert und aktualisiert man dynamisch eine große Tabelle?

Wenn nach all den oben Sie noch in Cassandra normalisierte Datenmodell verwenden möchten, empfehle ich Ihnen auf den ersten Blick auf secondary indexes und dann, um benutzerdefinierte Indizes bewegen auf wie Lucene index.

+0

Ok für die Replikation von Inhalten, aber wie würden Sie die Tabelle mit dem Problem modellieren, das ich angegeben habe (mehrere dynamische Filter)? Würden Sie für jede Kombination von Filtern eine Tabelle erstellen? Oder eine Tabelle plus viele materialisierte Ansichten? Welches ist das beste Modell für diesen Fall? –

+0

Ein Beispiel aus Cassandra: TDG-Buch schlägt vor, Abfragen, die Benutzer verwenden werden, vordefinieren (Beispiel aus dem Buch: Suche "Hotel" nach "Name" oder "free_rooms count") und Tabellen für jede Abfrage erstellen. Für alle Abfragen, die nicht vordefiniert sind, müssen Sie entweder 'SELECT *; 'auswählen und diese auf der App-Seite durcharbeiten oder sekundäre Indizes verwenden. – doz10us

+0

Der sekundäre Index wird jedoch nicht für Spalten mit eindeutigen Werten (der Index entspricht der Spalte) und für Spalten mit einigen unterschiedlichen Werten (z. B. Spalte "Geschlecht") empfohlen. – doz10us

Verwandte Themen