使用多列过滤器的 Cassandra 数据建模

Cassandra data modeling with multi-column filter

我有一个 Cassandra table stokes,它有 4 列 ( item(text) ,market ( text ) , location( text ) , time ( timestamp ) , value( int) ) 项目是一个分区键,市场、位置和时间是一个相同顺序的聚类键。

item | market | location | time | value
 x   |  m1    | l1       | t1   | v1
 x   |  m1    | l2       | t2   | v2
 x   |  m1    | l3       | t3   | v3
 y   |  m1    | l1       | t4   | v4
 y   |  m1    | l2       | t5   | v5
 y   |  m1    | l3       | t6   | v6

应用程序需要在两种情况下查询 Cassandra table

  1. 对于给定的商品、市场和位置,通过查询库存来获取记录 table。 例如,将获取记录下方的项目 x、市场 l1 和位置 l1
 x   |  m1    | l1       | t1   | v1
  1. 对于给定的商品、市场和所有位置,在输入时间后通过查询库存来获取记录 table。例如 item x , market m1 , t1 时间后的所有 location 记录都会被抓取

     x   |  m1    | l2       | t2   | v2
     x   |  m1    | l3       | t3   | v3
    

我了解在 Cassandra 应用程序需求和概念建模中,首先要对数据建模进行非形式化。我如何凸轮模型数据来满足我的两个应用程序要求。

对于我的第二个要求,我无法查询

select <columns> from <table> where item =x and market= m1 and time > t2; // wrong as location missing 

不允许跳过位置,位置可以是多个。如何建模或查询以满足这两个要求。

对于第一个应用程序查询,分区键是 item 并且 marketlocation 都是聚类列:

CREATE TABLE items (
    item text,
    market text,
    location text,
    time timestamp,
    value int,
    PRIMARY KEY (item, market, location)
)

对于第二个应用查询,它看起来与 items table 类似,只是数据按 markettime:

组织
CREATE TABLE locations_by_item (
    item text,
    market text,
    location text,
    time timestamp,
    value int,
    PRIMARY KEY (item, market, time)
)

当您从 table 检索数据时:

SELECT * FROM locations_by_item
  WHERE item = ?
  AND market = ?
  AND time > ?

它将 return 行 location + value。干杯!