我在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,是否有一种方法可以使数据非规范化,以便我可以对已经结束的对话进行查询?
我想过要有一个额外的字段,当一个会话终止消息到达系统时,可以由触发器来更新它,这有意义吗?
答案 0 :(得分:1)
在Cassandra中,您需要以回答问题的方式对数据建模。它与RDBMS不同,在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>)