我设计了一个列族
prodgroup text,prodid int,status int ,, PRIMARY KEY((prodgroup),prodid,status)
数据模型是为了迎合
除最后一个查询外,设计工作正常。除非我修复产品ID,否则Cassandra不允许查询状态。我认为定义一个具有关键“PRIMARY KEY((prodgroup),staus,productid)”的超级列系列应该可行。希望获得有关其他替代方案的专家建议。
答案 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管理,只要您点击该分区,这个就会很好地工作。
希望有所帮助。