插入后Cassandra更新前面的行

问题描述 投票:0回答:1

我在cassandra中有这个架构:

create table if not exists 
converstation_events(
    timestamp timestamp, 
    sender_id bigint, 
    conversation_id bigint, 
    message_type varchar, 
    message text, 
    primary key ((conversation_id), sender_id, message_type, timestamp));

并且有一个带有值conversation_ended的message_type,有没有办法对数据进行非规范化,这样我就可以对那些已经结束的会话进行查询?

我已经考虑过当一个conversation_ended消息到达系统时,有一个可以通过触发器更新的额外字段,这有意义吗?

cassandra data-modeling cqlsh
1个回答
1
投票

在Cassandra中,您需要以回答问题的方式对数据进行建模。它不像RDBMS,您首先创建模型然后创建查询。所以倒退吧......

当你在cassandra(大多数情况下)进行查询时,你需要通过主键查询,你可以使用你的聚类键来过滤或选择范围。它上面有一个great post

您的converstation_events表将为您提供有关对话,按发件人过滤,类型和时间的答案。 **如果您想按时间过滤,您必须在查询中包含sender_idmessage_type

但是你想要一个给定类型的所有对话,所以你需要另一个表来回答这个问题。如果您想要所有conversation_ended的对话,您可以创建第二个表格来将消息类型映射到对话,例如 -

conversation_by_message_type (
    message_type varchar, 
    conversation_id bigint, 
    timestamp timestamp, 
    primary key ((message_type), timestamp, conversation_id));

在客户端,只要您插入带有您可能想要查找的给定conversation_by_message_type的converstation_events事件,您就必须向message_type添加记录。我在这张表中有timestamp所以你可以按时间排序或过滤或timeconversation_id

要查找所有已结束的会话,您可以执行查询

<ids> = select conversation_id from conversation_by_message_type where message_type = 'conversation_ended'

select * from conversation_events where conversation_id IN (<ids>)
© www.soinside.com 2019 - 2024. All rights reserved.