目前我们有一个使用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_id
和 shipment_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_id
和 tenant_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_id
和 status_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/