Кассандра обновляет предыдущие строки после вставки - PullRequest
0 голосов
/ 21 марта 2019

У меня есть эта схема в Кассандре:

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 со значением dialog_ended, есть ли способ денормализовать данные, чтобы я мог выполнять запросы к тем разговорам, которые уже закончились?

Я думал о том, чтобы иметь дополнительное поле, которое может обновляться триггером при попадании в систему сообщения message_ended, имеет ли это смысл?

1 Ответ

1 голос
/ 22 марта 2019

В Кассандре вам нужно смоделировать свои данные таким образом, чтобы они отвечали на ваши вопросы.Это не то же самое, что СУБД, в которой вы сначала создаете модель, а затем создаете свои запросы.Так что думайте задом наперед ...

Когда вы делаете запрос в Кассандре (по большей части ...), вам нужно выполнить запрос по первичному ключу, и вы можете использовать свой ключ (ы) кластеризации для фильтрации иливыберите диапазоны. отличный пост .

Ваша таблица 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));

. На стороне клиента вам нужно будет добавить запись в * 1016.* каждый раз, когда вы вставляете событие spoktation_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>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...