简体   繁体   中英

Cassandra cql - sorting unique IDs by time

I am writting messaging chat system, similar to FB messaging. I did not find the way, how to effectively store conversation list (each row different user with last sent message most recent on top). If I list conversations from this table:

CREATE TABLE "conversation_list" (
    "user_id" int,
    "partner_user_id" int,
    "last_message_time" time,
    "last_message_text" text,
    PRIMARY KEY ("user_id", "partner_user_id")
)

I can select from this table conversations for any user_id . When new message is sent, we can simply update the row:

UPDATE conversation_list SET last_message_time = '...', last_message_text='...' WHERE user_id = '...' AND partner_user_id = '...'

But it is sorted by clustering key of course. My question: How to create list of conversations, which is sorted by last_message_time, but partner_user_id will be unique for given user_id?

If last_message_time is clustering key and we delete the row and insert new (to keep partner_user_id unique), I will have many so many thumbstones in the table.

Thank you.

A slight change to your original model should do what you want:

CREATE TABLE conversation_list (
    user_id int,
    partner_user_id int,
    last_message_time timestamp,
    last_message_text text,
    PRIMARY KEY ((user_id, partner_user_id), last_message_time)
) WITH CLUSTERING ORDER BY (last_message_time DESC);

I combined " user_id " and " partner_user_id " into one partition key. " last_message_time " can be the single clustering column and provide sorting. I reversed the default sort order with the CLUSTERING ORDER BY to make the timestamps descending. Now you should be able to just insert any time there is a message from a user to a partner id.

The select now will give you the ability to look for the last message sent. Like this:

SELECT last_message_time, last_message_text
FROM conversation_list
WHERE user_id= ? AND partner_user_id = ?
LIMIT 1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM