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_id
和 message_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
,因此您可以按时间或 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>)
我在 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_id
和 message_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
,因此您可以按时间或 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>)