【发布时间】:2017-07-31 14:45:03
【问题描述】:
我正在开发一项使用 Cassandra 作为数据存储的服务。我目前正在实施 Stop 服务,其中将包含 Stops 列表(乘客可以上车的交通站点,例如公共汽车)。
我需要支持以下场景:
- 按 id 停止
- 按公司 id 和机构 id 获取所有站点,按代码 asc、名称 asc 排序
这是我实现表格以支持这一点的方式:
CREATE TABLE IF NOT EXISTS stops(
id uuid,
client_id uuid,
agency_id uuid,
code varchar,
name varchar,
latitude double,
longitude double,
is_wheelchair_accessible boolean, PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS stops_by_client_id(
client_id uuid,
agency_id uuid,
code varchar,
name varchar,
id uuid,
latitude double,
longitude double,
is_wheelchair_accessible boolean,
PRIMARY KEY ((client_id, agency_id), code, name, id)
);
问题:
这在我插入数据并读取数据时效果很好。需要更新一站时出现问题:
- 更新停靠点并设置新代码、名称、纬度、经度等。
-
stops表上的更新不是问题,但我未能在stops_by_client_id投影上应用相同的更改。
到目前为止我尝试了什么:
- 我尝试通过 client_id、agency_id 和 id 更新行,但它需要传递所有主键值(client_id、agency_id、代码、名称、id)但在我的
StopUpdated事件中(我触发更新) 我没有可用于构造此类查询的代码和名称的先前值。 - 我尝试先删除该行,然后插入新行(以模拟更新),但失败的原因与 1 相同。
- 我尝试如下构造主键
PRIMARY KEY ((client_id, agency_id, id), code, name),但这会将每一行放在它自己的分区中,这会使选择查询非常低效。 - 我不能使用实体化视图,因为我需要某些字段(例如代码、is_wheelchair_accessible)的二级索引,以便过滤它们。
关于如何解决这种情况的任何想法?
【问题讨论】:
-
一个表可以同时具有物化视图和二级索引,所以 4) 仍然是一个选项。