Cassandra插入后更新前几行

时间:2019-03-21 12:02:10

标签: cassandra data-modeling cqlsh

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

并且有一个message_type,值是session_end,是否有一种方法可以使数据非规范化,以便我可以对已经结束的对话进行查询?

我想过要有一个额外的字段,当一个会话终止消息到达系统时,可以由触发器来更新它,这有意义吗?

1 个答案:

答案 0 :(得分:1)

在Cassandra中,您需要以回答问题的方式对数据建模。它与RDBMS不同,在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>)