2016-05-04 13 views
0

Wir versuchen, ein Datenmodell für Cassandra zu erstellen, und es gibt eine Option zum Speichern von Daten mit der Art Pfad Ansicht anstelle der klassischen Tabelle/Spaltenansicht.Cassandra "Pfad" Datenmodell

Zum Beispiel

CREATE TABLE data1 (
    user uuid, 
    timestamp timeuuid, 
    column1 int, 
    column2 int 
    primary key (user, timestamp) 
) 
CREATE TABLE `data2` (
    user uuid, 
    timestamp timeuuid, 
    column1 int, 
    column2 int 
    primary key (user, timestamp) 
) 

wird eine Tabelle wie:

create table all_data (
    user uuid, 
    timestamp timeuuid, 
    path text, 
    value blob 
    primary key (user, timestamp, path) 
) 

, wo wir Daten als

einfügen
insert into all_data (user, timestamp, path, value) values (1,0,'data1.column1',1) 
insert into all_data (user, timestamp, path, value) values (1,0,'data1.column2',2) 
insert into all_data (user, timestamp, path, value) values (1,9,'data2.column1',7) 
insert into all_data (user, timestamp, path, value) values (1,9,'data2.column1',8) 

Es ist etwas ähnlich wie Graphit statsd Metriken und Argumente sammelt zu Ein solches Modell soll eine Art spaltenbasierten Speicher mit besserer Leseleistung für on haben Die Spalte, da wir fast nie eine ganze Zeile erhalten müssen, sondern nur eine Spalte pro Benutzer innerhalb des Zeitbereichs.

Hat jemand Erfahrung mit einem solchen Datenmodell und hat es wirklich eine bessere Leistung als eine klassische? Kannst du dazu einen Rat geben?

+1

Wie können wir Ihre Datenmodellierung beantworten, wenn Sie die Daten, die Sie modellieren möchten, nicht beschrieben haben? – OrangeDog

Antwort

0

Hängt davon ab, welche Daten Sie suchen.
Wenn Sie jemals alle Spalten für [user, timestamp] abrufen möchten, sollten Sie das erste Modell verwenden. Eine Abfrage (WHERE user = 1 AND timestamp = 0) sucht nach einem Knoten, um alle Spalten abzurufen.
Um das zweite Modell zu verwenden, müssen Sie eine Abfrage für jede mögliche Kombination aus Benutzer/Zeitstempel/Pfad ausführen. Wenn nur Spalte1 & Spalte2 vorhanden wäre, würden Sie 2 Abfragen benötigen, um sie abzurufen (WHERE Benutzer = 1 UND Zeitstempel = 0 UND Pfad = 'Daten1.Spalte1') (WHERE Benutzer = 1 UND Zeitstempel = 0 UND Pfad = 'Daten1.Spalte2 '). Jede Zeile wäre möglicherweise auf einem anderen Knoten.
Das zweite Modell wäre weniger leistungsfähig.