我在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中,您需要以回答问题的方式对数据进行建模。它不像RDBMS,您首先创建模型然后创建查询。所以倒退吧......
当你在cassandra(大多数情况下)进行查询时,你需要通过主键查询,你可以使用你的聚类键来过滤或选择范围。它上面有一个great post。
您的converstation_events
表将为您提供有关对话,按发件人过滤,类型和时间的答案。 **如果您想按时间过滤,您必须在查询中包含sender_id
和message_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
所以你可以按时间排序或过滤或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>)