cassandra在insert之后更新前面的行

mctunoxg  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(331)

我在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结束的,有没有方法去规范化数据,这样我就可以对那些已经结束的对话进行查询?
我曾考虑过,当会话结束消息到达系统时,可以通过触发器更新一个额外的字段,这有意义吗?

35g0bw71

35g0bw711#

在cassandra中,您需要以一种能够回答您的问题的方式对数据进行建模。它不像rdbms那样先创建模型,然后再创建查询。所以,回头想想。。。
当您在cassandra中进行查询时(大多数情况下…),您需要按主键进行查询,并且可以使用集群键进行筛选或选择范围。一个很棒的帖子。
你的 converstation_events 表将按发件人、类型和时间筛选对话的答案。**如果要按时间筛选,则必须包括 sender_id 以及 message_type 在查询中。
但是您需要给定类型的所有会话,因此需要另一个表来回答此查询。如果你想要所有的谈话 conversation_ended 您可以创建第二个表来将消息类型Map到会话,例如-

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

在客户端,您必须向 conversation_by_message_type 任何时候只要你插入一个对话事件与给定的 message_type 你可能想看看。我有 timestamp 以便您可以按时间或时间进行排序或筛选 time 以及 conversation_id .
要查找所有结束的对话,可以执行以下查询

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

select * from conversation_events where conversation_id IN (<ids>)

相关问题