由于主键约束,Cassandra CQL SELECT / DELETE问题

时间:2014-09-08 15:54:35

标签: cassandra cql

我需要存储需要推送给用户的最新更新。 Cassandra表中的新闻源页面供以后检索,我的表架构如下:

CREATE TABLE newsfeed (user_name text, 
                       post_id bigint,
                       post_type text, 
                       favorited boolean, 
                       shared boolean, 
                       own boolean, 
                       date timestamp, 
       PRIMARY KEY (user_name,date,post_id,post_type) );

组合的前三列(用户名,postid和posttype)将构建表的实际主键,但是因为我想根据" date"对此表上的SELECT查询进行排序。我将日期列放入主键字段作为"第二个"进入(我必须这样做吗?)。

当我想通过仅提供" user_name,post_id和post_type"来删除行时如下:

 DELETE FROM newsfeed WHERE user_name='pooria' and post_id=36 and post_type='p';

我会收到以下错误:

Bad Request: Missing PRIMARY KEY part date since post_id is set

我需要将date-column作为主键的一部分,因为我想在我的ORDER BY子句中使用它,另一方面我必须删除一些行而不知道他们的" date"值!

那么Cassandra如何解决这些问题呢?我应该修复我的数据模型并为工作设置不同的模式吗?

1 个答案:

答案 0 :(得分:3)

DataStax的首席布道师Patrick McFadden发表了一篇文章,展示了一些时间序列建模模式。绝对是一个很好的阅读,应该对你有所帮助:Getting Started with Time Series Data Modeling

我觉得你的桌子很好。尽管如此,如果您无法跳过查询中的主键组件,那么复合主键在Cassandra中的工作方式。因此,如果您最终需要以user_namepost_id和/或post_type不同地查询数据(没有日期),则应该专门为该查询创建一个表(不是在主键中包含日期。)

我会说,一般来说,创建一个处理常规删除操作的表并不是一个好主意。事实上,我很确定这被归类为卡桑德拉的“反模式”。数据确实没有从Cassandra中删除;这是墓碑。墓碑在压实时进行协调(假设已经满足墓碑阈值时间),并且已知太多的墓碑会导致性能问题。

如果您阅读我上面链接的文章,请转到名为“时间序列模式3”的部分。您会注意到INSERT语句是使用USING TTL子句运行的。这为数据提供了以秒为单位的生存时间,之后它将“悄然消失”。例如,如果您希望将数据保持24小时(86400秒),则可以执行以下操作:

INSERT INTO newsfeed (...) VALUES (...) USING TTL 86400

使用TTL功能是DELETE定期清理的首选替代方法。