我需要在某个城市按时间顺序查找排名靠前的照片。我提出了以下架构
create table top_picture(
picture_id uuid,
city text,
rank int,
date timestamp,
primary key (city,date,rank)
) with CLUSTERING ORDER BY (date desc,rank desc);
通过执行以下查询
,确实在一定程度上解决了问题(除了重复)select * from top_picture where city='san diego';
。但是如果在同一天插入相同的picture_id,那么我会得到重复的条目,因为picture_id不是分区键的一部分。但是我不能将它添加到分区键,因为那时我将不能像上面那样进行简单的选择查询,因为我需要为picture_id提供选择查询,它不会为城市提供最佳图片。
之前是否有人遇到过这种类型的架构或其他任何建议的方法。
答案 0 :(得分:1)
听起来你想要两个数据视图。在一个视图中,您希望获得排名靠前的图片,而在另一个视图中,您希望picture_id是唯一的。
所以你可以有两个表,一个表有picture_id作为主键,另一个表示你已经显示。
当您要插入图片时,首先尝试使用insert语句中的IF NOT EXISTS子句将其插入到picture_id表中。如果该插入失败,则它是重复的,您不会将其插入top_picture表。
在Cassandra 3.0中,可以支持这样的物化视图,但是现在你必须在应用程序代码中管理这两个表。