2013-12-11 12 views
6

Mein UsecaseClustering Reihenfolge mit timeuuid CQL

Ich möchte nach Zeitstempel DESC für die Ergebnisse bestellen. Aber ich will nicht, Zeitstempel die zweite Spalte im Primärschlüssel sein, wie das wird Fähigkeit meiner anfragende nehmen

zum Beispiel

create table demo(oid int,cid int,ts timeuuid,PRIMARY KEY (oid,cid,ts)) WITH CLUSTERING ORDER BY (ts DESC); 

Abfragen erforderlich:

I want the result for all the below queries to be in DESC order of timestamp 

select * from demo where oid = 100; 
select * from demo where oid = 100 and cid = 10; 
select * from demo where oid = 100 and cid = 100 and ts > minTimeuuid('something'); 

Ich versuche, um diese Tabelle mit CLUSTERING ORDER IN CQL zu erstellen und diesen Fehler zu bekommen

In Dieses Dokument erwähnt, dass wir mehrere Schlüssel für die Cluster-Bestellung haben können. Kann jemand das tun?

Go here Datastax doc

Antwort

10
CREATE TABLE example (a int, b int, c int, d int, PRIMARY KEY (a,b,c)) WITH CLUSTERING ORDER BY (b DESC , c ASC) ; 

Ist die richtige Syntax mit mehreren Spalten für die Bestellung.


für Ihre Anwendung Sie versuchen, tatsächlich Ergebnisse deutlich unterschiedliche Arten von Anfragen zu erhalten. In Cassandra ist es am besten, jede Tabelle als Antwort auf eine bestimmte Abfrage zu gestalten.

Zum Beispiel (nicht so viel zu wissen über Ihre Anwendung)

select * from demo where oid = 100 and cid = 100 and ts > minTimeuuid('something'); 
select * from demo where oid = 100 and cid = 10; 

Könnte besser wie

durch eine Tabellenstruktur bedient werden
create table demo_oct(oid int,cid int,ts timeuuid, body, other ...., PRIMARY KEY ((oid,cid),ts)) WITH CLUSTERING ORDER BY (ts DESC); 

diese Weise wird jeder Satz von Zeitreihen für ein Paar oid- und cid-Daten befinden sich in ihrer eigenen Partition und sind leicht zu finden. Das liegt daran, dass ich einen Paritätsschlüssel verwende, der aus oid und cid besteht. Aus diesem Grund gibt es im Schlüssel zusätzliche Klammern. Der Clusterschlüssel ts stellt sicher, dass die Daten in der von Ihnen gewünschten Reihenfolge sind.

Aber wie Sie bemerkt haben, können Sie nicht select * from Tabelle oid == 10 auf dieser Tabelle durchführen, da das Scannen über die gesamte Datenbank (wegen der Partitionsstruktur)

Für die Anfragen wie

erfordern würde

Wählen Sie * aus der Demo, wobei oid = 100;

Sie brauchen eine zweite Tabelle (wieder nicht Ihre Anwendung zu wissen)

create table demo_ot(oid int,cid int,ts timeuuid, body, other ...., PRIMARY KEY (oid,ts)) WITH CLUSTERING ORDER BY (ts DESC); 

Diese Tabelle Zeitreihen in einem einzigen partiton für jede OID für extrem schnelle Scheiben erlauben würde halten. Hier ist der Partitionsschlüssel nur OID, während ts immer noch der Clusterschlüssel ist.

Auf der Anwendungsseite würden Sie beide Tabellen gleichzeitig einfügen.

More info on Datamodeling

+1

-Code nur Antworten sind selten, wenn überhaupt, sollten Sie gut, Qualität Antworten.Bitte versuchen Sie näher zu erläutern, warum * das eine akzeptable Antwort ist, indem Sie eine Erklärung und/oder relevante Links geben. – codeMagic

+0

@RussS diese wunderbare Erklärung. Im Grunde verschwenden wir Speicher für Abfrageleistung und Flexibilität, oder? – Shrikar

+1

Die Faustregeln in Cassandra sind, dass Schreibarbeiten billig sind. Also opfere Speicherplatz und formiere deine Daten wie deine Anfragen :) – RussS