复合关键点上的Cassandra范围切片

复合关键点上的Cassandra范围切片,cassandra,cql,cassandra-2.0,Cassandra,Cql,Cassandra 2.0,我有一个这样的组合键 CREATE TABLE sometable( keya varchar, keyb varchar, keyc varchar, keyd varchar, value int, date timestamp, PRIMARY KEY (keya,keyb,keyc,keyd,date) ); 我需要做的是 SELECT * FROM sometable WHERE keya = 'abc' AND

我有一个这样的组合键

CREATE TABLE sometable(
    keya varchar,
    keyb varchar,
    keyc varchar,
    keyd varchar,
    value int,
    date timestamp,
    PRIMARY KEY (keya,keyb,keyc,keyd,date)
);
我需要做的是

SELECT * FROM sometable
WHERE
    keya = 'abc' AND
    keyb = 'def' AND
    date < '2014-01-01'
解决这个问题的最好办法是什么?我需要改变我的家庭吗?
我还需要查询那些包含所有keya、keyb、keyc和date的表。

您不能在cassandra中进行查询。此外,这种范围切片的成本也更高。您正试图根据您的模式切分一组优先级较低的等式

我还需要查询那些包含所有keya、keyb、keyc和date的表

如果您正在考虑解决此问题,请考虑使用此模式。我建议将这些键放在一个单独的模式中

创建表( timeuuid id, 键入文本, 主键(timeuuid,keyType))

使用timeuuid存储值,并基于该值执行范围扫描

创建表( timeuuid prevTableId, 值int, 日期时间戳, 主键(prevTableId,日期))


猜猜,通过这种方式,您的表被规范化,以便在您的用例中获得更好的可伸缩性,并且如果键也是重复的,那么可能会节省大量磁盘空间

根据您的建议,我是否需要这样做:
创建表(id timeuuid,keya text,keyb text,keyc text,keyd text,primary key,id,keya,keyb,keyc,keyd)
创建表(id timeuuid,value int,date timestamp,primary key,id,date)
。当我需要使用keya、keyb和date进行查询时,我是否必须查询第一个表并获得id列表,然后使用第二个表再次查询,该表的日期范围切片带有一组id?我认为这不是一个好方法。我是否遗漏了什么?是的。因为我觉得keya、keyb、keyc和keyd都是文本,所以我将其称为keyType并将其保留在群集键部分。这样,您甚至可以为特定的键类型获取一组timeuuid。但不确定用例中的键变量。如果它要求所有类型都出现在群集键中,也不会造成任何伤害。但无论如何,您需要keya来查询keyb。
Bad Request: PRIMARY KEY part date cannot be restricted (preceding part keyd is either not restricted or by a non-EQ relation)