2014-02-27 49 views
3

我有一个列族与主键定义是这样的:卡桑德拉CQL - 聚类以便与多个聚类列

... 
PRIMARY KEY ((website_id, item_id), user_id, date) 

这将使用查询诸如被查询:

SELECT * FROM myCF 
WHERE website_id = 30 AND item_id = 10 
AND user_id = 0 AND date > 'some_date' ; 

然而,我'd想保留我的专栏仅按日期排序,如SELECT date FROM myCF ;将返回最近插入的日期。

由于聚类列的顺序,我得到的是每个user_id然后每个日期的订单。 如果我改变主键定义:

PRIMARY KEY ((website_id, item_id), date, user_id) 

我不能再运行相同的查询,如日期必须限制为user_id是。

我想可能有一些方式来表达:

... 
    PRIMARY KEY ((website_id, shop_id), store_id, date) 
) WITH CLUSTERING ORDER BY (store_id RANDOMPLEASE, date DESC) ; 

但它似乎并不存在。最糟糕的是,也许这完全是愚蠢的,我不明白为什么。

有什么办法可以达到这个目的吗?我错过了什么吗?

非常感谢!

回答

5

您的查询示例限制了user_id,因此应该使用第二个表格格式。但是,如果你实际上是试图像

SELECT * FROM myCF 
WHERE website_id = 30 AND item_id = 10 
AND date > 'some_date' 

然后你需要的是创建以处理这些查询附加表运行的查询,它只会在日期顺序,而不是用户ID

Create Table LookupByDate ... PRIMARY KEY ((website_id, item_id), date) 
+0

感谢您的回答@RussS。第二种格式:'PRIMARY KEY((website_id,item_id),date,user_id)'阻止我使用过滤器:'AND user_id = 0 AND date>'some_date';'由于日期在user_id之前并且受到非EQ方程。 现在没有user_id作为分区列的第二个解决方案阻止我拥有每个用户数据,因为unicity受三元组(site_id,item_id,date)约束。 我错了吗? – kevad

+3

不,你只需要使用*两个*表。在写入时插入两者。 即你需要为这些查询格式的每一个表格 – RussS

+0

好吧,我明白你的意思。感谢您的回答,并感谢您的澄清! – kevad

1

在除了主查询之外,如果您试图获得的是“返回最近插入的日期”,则可能不需要额外的表。您可以使用“静态列”来存储每个分区的上次更新时间。 CASSANDRA-6561