Cassandra 在插入后更新前一行

Cassandra update previous rows after insert

我在 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 的值为 conversation_ended,有没有办法对数据进行非规范化,以便我可以对那些已经结束的对话进行查询?

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

在 Cassandra 中,您需要以能够回答问题的方式对数据建模。它不像 RDBMS,您先创建模型然后创建查询。所以向后想想...

当您在 cassandra 中进行查询时(大多数情况下...),您需要通过主键进行查询,您可以使用聚类键来过滤或 select 范围。一个great post就可以了。

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

但是您需要给定类型的所有对话,因此您需要另一个 table 来回答此查询。如果你想要所有 conversation_ended 的对话,你可以创建第二个 table 来将消息类型映射到对话,比如 -

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

在客户端,每当您插入一个带有给定 message_type 的 converstation_events 事件时,您都必须向 conversation_by_message_type 添加一条记录,您可能想要查找。我在这个 table 中有 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>)