Порядок кластеризации с использованием timeuuid CQL

Мой вариант использования

Я хочу отсортировать результаты по метке времени DESC. Но я не хочу, чтобы временная метка была вторым столбцом в первичном ключе, поскольку это потребует моих возможностей запросов.

Например

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

Требуются запросы:

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

Я пытаюсь создать эту таблицу с помощью CLUSTERING ORDER IN CQL и получаю эту ошибку

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

В этом документе упоминается, что у нас может быть несколько ключей для упорядочивания кластеров. кто-нибудь знает, как это сделать?

Перейдите сюда Datastax doc


person Shrikar    schedule 11.12.2013    source источник


Ответы (1)


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

Правильный синтаксис для упорядочивания с несколькими столбцами.


Для вашего конкретного приложения вы фактически пытаетесь получить результаты по совершенно разным типам запросов. В Cassandra лучше всего формировать каждую таблицу так, чтобы она была ответом на конкретный запрос.

Например (мало что известно о вашем приложении)

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

Может быть лучше обслуживается такой структурой таблицы, как

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

Таким образом, каждый набор временных рядов для пары данных oid и cid будет находиться в своем собственном разделе, и их будет легко получить. Это потому, что я использую ключ разделения, состоящий из oid и cid. Вот почему в ключе есть дополнительный набор скобок. Ключ кластеризации ts гарантирует, что данные находятся в нужном вам порядке.

Но, как вы заметили, вы не можете выполнить select * from table oid == 10 в этой таблице, потому что для этого потребуется сканирование всей базы данных (из-за структуры разделов)

Для запросов вроде

выберите * из демонстрации, где oid = 100;

вам нужна вторая таблица (опять же, не зная вашего конкретного приложения)

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

В этой таблице будут храниться временные ряды для каждого OID в одном разделе, что позволяет создавать очень быстрые срезы. Здесь ключ раздела - это просто OID, в то время как ts по-прежнему является ключом кластеризации.

Со стороны приложения вы будете выполнять вставку в обе эти таблицы одновременно.

Дополнительная информация о моделировании данных

person RussS    schedule 11.12.2013
comment
Только кодовые ответы редко, если вообще когда-либо, считаются хорошими и качественными ответами. Пожалуйста, постарайтесь подробнее объяснить, почему является приемлемым ответом, предоставив объяснение и / или соответствующие ссылки. - person codeMagic; 12.12.2013
comment
@RussS, это потрясающее объяснение. По сути, мы тратим хранилище на производительность и гибкость запросов, верно? - person Shrikar; 12.12.2013
comment
Эмпирическое правило в Cassandra гласит, что запись стоит дешево. Так что жертвуйте хранилищем и формируйте свои данные так, как хотят ваши запросы :) - person RussS; 12.12.2013