【问题标题】:Store ordered items in Cassandra在 Cassandra 中存储订购的商品
【发布时间】:2012-08-18 00:14:21
【问题描述】:

我正在开发应该使用 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,并且会损坏负载平衡和性能。

【问题讨论】:

  • 有多少项?插入、删除和查询的相对频率是多少?
  • 见this answer,因为它足够相似,可以给你正确的想法。
  • @ChrisGerken items 的数量:~ 50 个 每个用户,因此每行有 ~50 列。 插入的数量:每天约 10 个。 查询量:每天最多约 2000-5000 个。 删除的数量:每天约 5-10 个。此外,用户的数量约为 10 000 - 20 000。

标签: nosql cassandra


【解决方案1】:

我希望您会很高兴知道在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 2019-05-29
    • 2016-08-19
    • 2017-01-29
    • 1970-01-01
    • 2018-12-03
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多