【问题标题】: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 管理,所以只要您访问分区,它就会很好地工作。
希望对您有所帮助。