我正在研究应该使用Apache Cassandra存储数据的Web应用程序。 我需要存储每个项目的评级,然后获得评分最高的项目列表。
所以任务 - 以排序的顺序存储项目的一些附加信息,以摆脱客户端订购或使用ORDER BY订购。
其中一个可能的选择是创建索引列族:
userId {
100_ItemId1 : null,
90__ItemId2 : null,
80__ItemId3 : null,
80__ItemId4 : null
}
注意: userId是行的键,100,90,80 - 是评级值
但是这里有一个删除问题,我们应该知道以前的评级值来删除索引,它可能需要在列族中存储反向信息:
reversed_userId{
ItemId1 : 100_ItemId1,
ItemId2 : 100_ItemId2,
...
}
请问您是否有一些模式可以有效地存储订购的商品?
P.S:我不打算使用OrderPreservingPartitioner,因为它可以应用于整个KeySpace,它可能会损害负载平衡和性能。
答案 0 :(得分:0)
我希望您能够高兴地知道,在CQL 3中,您现在可以使用复合键结构进行排序。
http://www.datastax.com/dev/blog/whats-new-in-cql-3-0
例如:
CREATE TABLE SortedPosts (
post_id int,
sort_order int,
post_title text,
PRIMARY KEY(post_id, sort_order)
);
sort_order会对它进行排序。你可以:
SELECT * FROM SortedPosts WHERE post_id = 1 ORDER BY sort_order ASC
SELECT * FROM SortedPosts WHERE post_id = 1 ORDER BY sort_order DESC