2013-12-11 13 views
6

My UsecaseOrdine di clustering con timeuuid CQL

Desidero ordinare per data/ora DESC per i risultati. Ma io non voglio timestamp di essere la seconda colonna della chiave primaria come che avrà la mia capacità di interrogazione

ad esempio

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

query richieste:

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'); 

sto cercando per creare questa tabella con CLUSTERING ORDER IN CQL e ottenere questo errore

cqlsh:v> create table demo(oid int,cid int,ts timeuuid,PRIMARY KEY (oid,cid,ts))  WITH CLUSTERING ORDER BY (ts desc); 
Bad Request: Missing CLUSTERING ORDER for column cid 

In in questo documento si menziona che possiamo avere chiavi multiple per l'ordinamento dei cluster. Qualcuno sa come farlo?

Go here Datastax doc

risposta

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) ; 

è la sintassi corretta per l'ordinazione con più colonne.


Per la particolare applicazione in realtà stai cercando di ottenere risultati da tipi di query distintamente diversi. In Cassandra è meglio modellare ogni tabella come risposta a una particolare query.

Per esempio (non sapendo che molto circa l'applicazione)

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

potrebbe essere meglio serviti da una struttura tavolo come

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

In questo modo ogni insieme di serie storiche per un paio di i dati di oid e cid risiederanno nella propria partizione e saranno facili da recuperare. Questo perché sto usando una chiave Parition composta da oid e cid. Questo è il motivo per cui c'è un ulteriore set di parentesi nella chiave. La chiave di clustering assicura che i dati siano nell'ordine desiderato.

Ma come avete notato, non è possibile eseguire select * from tabella == OID 10 su questo tavolo, perché ciò richiederebbe la scansione su tutto il database (a causa della struttura delle partizioni)

Per le query come

seleziona * da demo dove oid = 100;

è necessario una seconda tabella (ancora una volta non conoscendo la vostra applicazione particolare)

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

Questa tabella avrebbe mantenuto serie storiche per ogni OID in un unico partitone consentendo fette estremamente veloci. Qui la chiave di partizione è solo OID mentre ts è ancora la chiave di clustering.

Per quanto riguarda l'applicazione, si inseriscono entrambe le tabelle contemporaneamente.

More info on Datamodeling

+1

Codice uniche risposte sono raramente, se non mai, considerare buona, risposte di qualità.Si prega di provare a elaborare * perché * è una risposta accettabile fornendo una spiegazione e/o collegamenti pertinenti. – codeMagic

+0

@RussS quella splendida spiegazione. Quindi, in sostanza, sprechiamo spazio di archiviazione per le prestazioni e la flessibilità delle query? – Shrikar

+1

Le regole empiriche di Cassandra sono che le scritture sono economiche. Quindi sacrifica l'archiviazione e forma i tuoi dati come vogliono le tue domande :) – RussS