1

我设计了一个列族

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

数据模型是为了迎合

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

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

4

1 回答 1

3

如果您提供分区键(本例中为组 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 管理,因此只要您访问分区,它就会很好地工作。

希望有帮助。

于 2014-12-22T11:17:37.397 回答