定义Cassandra数据模型的难度

时间:2014-01-26 08:02:26

标签: cassandra cassandra-2.0

我是Casssandra的新手,我觉得很难实现数据模型。

我在设计单个表时面临很多问题。

在我提到表格定义之前,我想向您展示我们检索和更新记录的方法

select * from email where username='suresh' and inactive='N' and type='outbound'
    order by insert_ts desc allow filtering;
update email set inactive='Y' where username='suresh' and inactive='N' 
    and id=101;

要创建表,我应该遵循所有cassandra定义的规则。我在为表创建索引时遇到了问题

如果我像这样创建主键

PRIMARY KEY(username, inactive,type,insert_ts);

我能够检索记录,但是当我更新时,我收到错误,说“在设置中找到主键部分”错误。

如果我创建主键和辅助键,如下所示

PRIMARY KEY(username, type,insert_ts);
Secondary index = inactive;

我能够进行更新但是当我检索时,我收到错误说“订购子条款不允许使用二级索引”

我使用cql创建了电子邮件表,如

Create table email(id int, username varchar, comment text, 
  inactive boolean, insert_ts timestamp, type varchar,
PRIMARY KEY(<<some columns yet to decide>>));

请建议我如何创建满足我查询的电子邮件表。

2 个答案:

答案 0 :(得分:0)

根据您的信息,inactive不应该是主键的一部分,因为您打算在不创建新行的情况下随时更改。使用它作为基本假设,您需要使用PRIMARY KEY(username, type, insert_ts);

您将无法同时按二级索引进行过滤,并同时使用ORDER BY [anything]。从2.0.3开始,查询引擎不允许这样做。两种缓解方法是可能的:

1)不要将inactive作为索引,也不要将其用于过滤。

根据您的示例,inactive似乎是一个低基数值(Y或N),而且,您一次操作几行(您将查询限制为username和/或id)。因此,就结果数量而言,从查询中省略inactive应该不会很昂贵。使用inactive时,您可以在客户端过滤SELECT行。

2)不要使用ORDER BY时间戳。

与上述相同,除了在客户端上进行过滤之外,您现在负责在客户端上进行排序。

应根据您的数据和使用案例确定哪种缓解措施更为合适。我的预感是#1是最好的方式,因为你引入了一个极低的基数,可能经常更新的索引,似乎是非常简单的额外便利。

答案 1 :(得分:0)

感谢您的回复。

根据您的建议,我了解应从主键中删除基数较低的非活动列。我很好,我会在客户端进行非活动过滤。但是,在客户端过滤insert_ts不会解决我的问题,因为该表中将存在数千个电子邮件记录。

Create table email(id int, username varchar, comment text,
  inactive boolean, insert_ts timestamp, type varchar,
PRIMARY KEY(username,type,insert_ts, id))
With Clustering(Type ASC, insert_ts desc, id asc);

另外我想在主键中添加ID列,因为我们要求显示限制为100的电子邮件记录.Cassandra有Limit子句负责过滤,我可以使用id值来查找下一条100条记录。

例如:

Select * from email where username='suresh' and type='outbound' 
  order by type,insert_ts desc, id 
Limit 101;

在这种情况下,我知道101记录ID,我将其用于需要获取下100条记录的请求。

我希望我理解得很好。如果您发现任何差距,请告诉我。