【问题标题】:Cassandra primary key design to cater range queryCassandra 主键设计迎合范围查询
【发布时间】:2014-12-21 10:23:57
【问题描述】:

我设计了一个列族

prodgroup 文本,prodid int,status int,, 主键((prodgroup),prodid,状态)

数据模型是为了迎合

  • 从产品组中获取产品列表
  • 获取给定 ID 范围的产品列表
  • 获取特定产品的详细信息
  • 更新产品活动/非活动状态
  • 获取活动或非活动产品列表(从 prodgroup='xyz' and prodid > 0 and status = 0 的产品中选择 *)

设计工作正常,除了最后一个查询。除非我修复产品 ID,否则 Cassandra 不允许查询状态。我认为定义一个具有键“PRIMARY KEY((prodgroup), staus, productid)”的超级列族应该有效。希望获得有关其他替代方案的专家建议。

【问题讨论】:

    标签: cassandra cassandra-2.0 cassandra-jdbc nosql


    【解决方案1】:

    如果您要提供分区键(本例中为组 ID),那么这是二级索引的理想用例。创建一个关于状态的次要索引,您将能够查询状态的完全相等。确保提供分区键,因为如果不提供,查询将转到集群中的每个节点,并且可能会超时。如果您确实提供了分区键(您似乎正在这样做),那么状态二级索引应该允许您执行查询。

    还有另一个问题...您拥有作为 pk 一部分的状态。这意味着您不能为产品更新它。您只能为不同的状态创建新行。这可能不是您所需要的。如果是这样,您需要在最后一个查询中使用 ALLOW FILTERING(这不会对性能造成太大影响,因为您已经过滤到分区了)。

    对于您的用例,这是我将使用的架构和查询。我相信它涵盖了所有用例:

    create table products2(
        prodgroup text,
        prodid int,
        status int,
        primary key (prodgroup, prodid)
    );
    
    create index on products2 (status);
    
    select * from products2 where prodgroup='groupname' and prodid>0 and status=0;
    

    由于二级索引更新是原子的并由 cassandra 管理,所以只要您访问分区,它就会很好地工作。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 2015-03-10
      • 2016-07-21
      • 1970-01-01
      • 2012-03-13
      • 2015-08-18
      相关资源
      最近更新 更多