Cassandra主键设计,以满足范围查询

时间:2014-12-21 10:23:58

标签: cassandra cassandra-2.0 cassandra-jdbc nosql

我设计了一个列族

prodgroup text,prodid int,status int ,, PRIMARY KEY((prodgroup),prodid,status)

数据模型是为了迎合

  • 获取产品组中的产品列表
  • 获取给定范围的ID的产品列表
  • 获取特定产品的详细信息
  • 更新产品的状态acive / inactive
  • 获取有效或无效的产品列表(从产品中选择*,其中prodgroup ='xyz'和prodid> 0且状态= 0)

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

1 个答案:

答案 0 :(得分:3)

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

还有另一个问题......你的状态是pk的一部分。这意味着您可以为产品更新它。您只能为不同的状态创建新行。这可能不是你需要的。如果是的话,您需要在最后一次查询中允许过滤(因为您已经过滤到分区,因此不会受到很大的影响)。

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

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管理,只要您点击该分区,这个就会很好地工作。

希望有所帮助。