在更新

时间:2017-07-31 14:45:04

标签: cassandra cassandra-3.0

我正在开发一个使用Cassandra作为数据存储的服务。我目前正在实施停止服务,其中包含停靠点列表(乘客可以登上车辆的交通站点,例如公交车)。

我需要支持以下方案:

  1. 以ID身份停止
  2. 按公司ID和代理机构ID排序,按代码asc,名称asc
  3. 排序

    以下是我实现表格的方式来支持:

    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)
    );
    

    问题:

    当我插入数据并读取数据时,这很有效。当我需要更新一个停止时会出现问题:

    1. 更新停止并设置新代码,名称,纬度,经度等。
    2. stops表上的更新不是问题,但我未能对stops_by_client_id投标应用相同的更改。
    3. 到目前为止我尝试了什么:

      1. 我尝试通过client_id,agency_id和id更新行,但它需要传递所有主键值(client_id,agency_id,代码,名称,ID),但需要传递StopUpdated事件(我触发的事件)更新)我没有以前的代码和名称值,我可以使用它来构造这样的查询。
      2. 我尝试先删除该行,然后插入新行(以模拟更新),但失败的原因与1相同。
      3. 我尝试构建主键,如下所示PRIMARY KEY ((client_id, agency_id, id), code, name)但是这会将每一行放在它自己的分区中,这会使选择查询效率非常低。
      4. 我无法使用物化视图,因为我需要某些字段的二级索引(例如代码,is_wheelchair_accessible),所以我可以过滤它们。
      5. 关于如何解决这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

最后,我更改了我的体系结构并修改了StopUpdate事件以包含新旧状态(更新前后)。这样我就可以收集所有信息来组装查询。

答案 1 :(得分:0)

使用id获取要更新的行的client_id和agency_id以及其他复合键的现有值,并使用这些值删除stops_by_client_id中的行。

stops表中更新该行后,您必须从表中获取该ID的其他列的值,并在stops_by_client_id表中创建一个新行。

希望这就是你要找的东西。