cassandra - 如何对表进行建模以根据随时间变化的状态字段运行查询

标签 cassandra cassandra-2.0 cassandra-3.0

目前我们有一个使用shipment_id查询的表,将来我们需要根据status字段进行查询 当前表:

CREATE TABLE shipment ( 
    shipment_id text,
    tenant_id text,
    actual_arrival_time text,
    actual_dep_time text,
    email_ids set,
    is_deleted boolean,
    modified_by text,
    modified_time timestamp,
    planned_arrival_time text,
    planned_dep_time text,
    route_id text,
    shipment_departure_date text,
    status_code text,
    PRIMARY KEY (shipment_id, tenant_id) 
); 

CREATE INDEX shipment_id_index ON shipment (tenant_id);

当前查询

1) 从发货中选择*,其中tenant_id=?0 允许过滤;

2) 从发货中选择* WHEREshipment_id=?0 和tenant_id=?1;

待处理/ future 查询

截至目前给定状态代码的货件 ID 列表 3) 从装运中选择*,其中tenant_id = 'y'且status_code = x? ;

4) 过去 1 周给定状态代码的货件 ID 列表

5) 延迟的货件 ID 列表

上表可能有 10-15 个唯一租户 并且将有 1shipment_id、1tenant_id 每表 1 行 并且 status_code 将随着发货进度而变化,从 Shipment_started、shipment_progress、shipment_delayed、shipment_delayed_completed 和shipment_completed 等 每批 cargo 在其生命周期内都会经历3-5种状态,当前表格 仅当给定的shipment_id的状态发生变化时才会更新。

我需要创建一个新表来解决如下查询

3) 目前给定租户的发货列表,其中 status_code = 'x'

4) 过去 1 周 status_code = 'x' 的给定租户的发货列表

5) 延迟发货的 list ?

最佳答案

在 Cassandra 中,您可以根据查询对表进行建模,因此您实际上可以为可能执行的每个查询创建一个表。另外,在查询中使用 ALLOW FILTERING 只能用于开发和测试目的,而不应用于实际的生产应用程序(在此处查看答案:Cassandra CQLEngine Allow Filtering)。

因此,对于您提到的每个案例/查询,我建议如下:

1) SELECT * FROMshipment wheretenant_id=?0 ALLOW FILTERING;

这应该通过下表解决:

CREATE TABLE shipment ( 
    tenant_id text,
    shipment_id text,
    actual_arrival_time text,
    actual_dep_time text,
    email_ids set,
    is_deleted boolean,
    modified_by text,
    modified_time timestamp,
    planned_arrival_time text,
    planned_dep_time text,
    route_id text,
    shipment_departure_date text,
    status_code text,
    PRIMARY KEY (tenant_id, shipment_id) 
);

这里的tenant_id分区键,因此如果您执行查询:SELECT * FROMshipment wheretenant_id='x'; 那么您就不再需要使用ALLOW FILTERING

更新:我还添加了 shipment_id 作为主键的一部分,以处理相同的基数,以防 tenant_id 不唯一,因此主键tenant_idshipment_id 组成,以避免覆盖具有相同 tenant_id 的记录 根据@Himanshu Ahire 的评论。

2)从发货中选择* WHEREshipment_id='x'和tenant_id='y';

这应该通过下表解决:

CREATE TABLE shipment ( 
    shipment_id text,
    tenant_id text,
    actual_arrival_time text,
    actual_dep_time text,
    email_ids set,
    is_deleted boolean,
    modified_by text,
    modified_time timestamp,
    planned_arrival_time text,
    planned_dep_time text,
    route_id text,
    shipment_departure_date text,
    status_code text,
    PRIMARY KEY ((shipment_id, tenant_id)) 
);

此处,shipment_idtenant_id 均用作 composite partition key

3) 从发货中选择*,其中tenant_id = 'y'且status_code = 'x';

4) 过去 1 周给定状态代码的货件 ID 列表

5) 延迟的货件 ID 列表

这些应通过下表解决:

CREATE TABLE shipment (
    status_code text,
    tenant_id text,
    shipment_id text,
    actual_arrival_time text,
    actual_dep_time text,
    email_ids set,
    is_deleted boolean,
    modified_by text,
    modified_time timestamp,
    planned_arrival_time text,
    planned_dep_time text,
    route_id text,
    shipment_departure_date text,
    PRIMARY KEY ((tenant_id, status_code), actual_arrival_time) 
) WITH CLUSTERING ORDER BY (actual_arrival_time DESC);

在这里,您还应该使用 tenant_idstatus_code 作为复合分区键,并将 actual_arrival_time 作为 >聚类列 这样您就可以轻松创建如下查询:

3) 从发货中选择*,其中tenant_id = 'y'且status_code = 'x';

4) 从发货中选择*,其中tenant_id = 'y'且status_code = 'x'且actual_arrival_time >= '上周日期';

5) 从发货中选择*,其中租户_id = 'y' 且 status_code = 'x' 且实际到达时间 > 计划到达时间;

只是查询编号 4 的注释,您可以通过应用程序代码或使用 cql functions 发送上周的日期

关于cassandra - 如何对表进行建模以根据随时间变化的状态字段运行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53860841/

相关文章:

cassandra - 如何使 Cassandra 对特定行键具有不同的列键?

openjdk - 当前安装的提供商无法支持 TLS_RSA_WITH_AES_256_CBC_SHA

Cassandra:集群或数据中心所有节点上的主要范围完全修复

Cassandra 赫克托客户 : Is a RangeSlicesQuery on Composite Row Keys possible when using Random Partitioning?

cassandra - 哪个版本的 cqlsh 与 Cassandra 2.1.9 兼容?

cassandra - Gremlin 服务器 Cassandra

python - 在linux上安装cassandra驱动程序,以便我可以从python连接到cassandra

用于 apache cassandra 的 python ORM

cassandra - cassandra 3.0.x 和 3.11.x 版本之间的差异

java - 如何使用 Cassandra Java 驱动程序访问带有嵌套映射的列表