Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于主键约束,Cassandra CQL选择/删除问题_Cassandra_Cql - Fatal编程技术网

由于主键约束,Cassandra CQL选择/删除问题

由于主键约束,Cassandra CQL选择/删除问题,cassandra,cql,Cassandra,Cql,我需要在Cassandra表中存储需要推送到用户newsfeed页面的最新更新,以便以后检索,我的表的架构如下: CREATE TABLE newsfeed (user_name text, post_id bigint, post_type text, favorited boolean, shared b

我需要在Cassandra表中存储需要推送到用户newsfeed页面的最新更新,以便以后检索,我的表的架构如下:

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) );
 DELETE FROM newsfeed WHERE user_name='pooria' and post_id=36 and post_type='p';
前三列用户名、postid和posttype的组合将构建表的实际主键,但是,由于我想根据行的日期对该表上的SELECT查询排序,因此我将日期列放入主键字段,因为第二个条目必须这样做

当我想通过只提供用户名、post\U id和post\U类型来删除一行时,如下所示:

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) );
 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列作为主键的一部分,因为我想在ORDER BY子句中使用它,另一方面,我必须删除一些行,而不知道它们的日期值


那么卡桑德拉如何解决这些问题呢?我是否应该修复我的数据模型,并为工作使用不同的模式?

DataStax的首席传教士Patrick McFadden发表了一篇文章,展示了一些时间序列建模模式。绝对是一本好书,应该对你有所帮助:

我觉得你的桌子很好。尽管如此,由于复合主键在Cassandra中的工作方式,如果您不能跳过查询中的主键组件。因此,如果您最终需要按用户名、post\u id和/或post\u类型以不同的方式查询数据,而不使用日期,那么您应该专门为该查询创建一个表,该表的主键中不包含日期

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

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

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

使用TTL功能是通过删除进行常规清理的更好选择。

如果您的查询导致读取墓碑,则即使使用TTL,也可能会遇到墓碑问题。为了避免这种情况,请确保不要尝试查询包含已删除记录的范围。@rs\U atl您是对的,但这是一种比删除重表更好的设计。当然。只是想指出TTL仍然是删除。我不认为他在寻找过期的数据,但从问题上看还不清楚。@BryceAtNetwork23谢谢你的回答,问题是我需要日期作为主键的一部分来排序结果,我无法创建另一个表,因为这是将在其新闻提要上显示给用户的表,并且我允许用户从其新闻提要中删除任何他们想要的内容!基本上,我必须在一个表上使用选择/删除功能,否则就没有意义了