Cassandra-如何使用复合键更新记录

时间:2018-06-22 19:55:34

标签: cassandra nosql cql

在学习Cassandra并将其用于工作中的小型试点项目的过程中。我有一张被3个字段过滤的表格:

fmap

然后我可以像这样拉记录,这正是我需要的查询:

CREATE TABLE webhook (
    event_id text,
    entity_type text,
    entity_operation text,
    callback_url text,
    create_timestamp timestamp,
    webhook_id text,
    last_mod_timestamp timestamp,
    app_key text,
    status_flag int,
    PRIMARY KEY ((event_id, entity_type, entity_operation))
);

但是,我有一个更新查询来将记录设置为非活动状态(软删除),这可以通过 same 表中的分区键来最方便地进行。当然,这是不可能的:

select * from webhook
where event_id = '11E7DEB1B162E780AD3894B2C0AB197A'
and entity_type = 'user'
and entity_operation = 'insert';

为什么要执行此操作的一个示例是从API端点进行的简单DELETE:

update webhook
set status_flag = 0
where webhook_id = '11e8765068f50730ac964b31be21d64e'

很自然地,如果我根据组合键进行更新,则可能使更多的记录无效。

似乎是我唯一的选择,使用“ Cassandra Way”方法是使用两个表。我已经拥有一个,并且可以通过webhook_id跟踪status_flag,因此我可以基于该ID进行更新。然后,我必须在第一个表中通过webhook_id进行选择,并在那里禁用它?否则,我将不得不迫使用户在API的DELETE请求的URL中传递所有复合键值。

在关系数据中理所当然的简单事物,在卡桑德拉(Cassandraland)似乎变得非常复杂。是这种情况还是让我变得比实际复杂?

1 个答案:

答案 0 :(得分:0)

您可以将webhook添加到主键。 因此,您的表定义变得像这样。

CREATE TABLE webhook (
event_id text,
entity_type text,
entity_operation text,
callback_url text,
create_timestamp timestamp,
webhook_id text,
last_mod_timestamp timestamp,
app_key text,
status_flag int,
PRIMARY KEY ((event_id, entity_type, entity_operation),webhook_id)

现在可以说您插入2条记录。

INSERT INTO dev_cybs_rtd_search.webhook(event_id,entity_type,entity_operation,status_flag,webhook_id) VALUES('11E7DEB1B162E780AD3894B2C0AB197A','user','insert',1,'web_id');

INSERT INTO dev_cybs_rtd_search.webhook(event_id,entity_type,entity_operation,status_flag,webhook_id) VALUES('12313131312313','user','insert',1,'web_id_1');

您可以按照以下说明进行更新

update webhook
set status_flag = 0
where webhook_id = 'web_id' AND event_id = '11E7DEB1B162E780AD3894B2C0AB197A' AND entity_type = 'user'
AND entity_operation = 'insert';

它只会更新1条记录。

但是,您必须发送主键中定义的所有内容。