在学习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)似乎变得非常复杂。是这种情况还是让我变得比实际复杂?
答案 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条记录。
但是,您必须发送主键中定义的所有内容。