Search code examples
cassandrainsert-updatedenormalization

Updating denormalized data in Cassandra


I'm trying to build a news feed system using Cassandra, I was thinking of using a fan out approach wherein if a user posts a new post, I'll write a new record in all of his friends' feed table. The table structure looks like:

CREATE TABLE users (
   user_name TEXT,
   first_name TEXT,
   last_name TEXT,
   profile_pic TEXT,
   PRIMARY KEY (user_name)
); 

CREATE TABLE user_feed (
   user_name TEXT,
   posted_time TIMESTAMP,
   post_id UUID,
   posted_by TEXT, //posted by username
   posted_by_profile_pic TEXT,
   post_content TEXT,
   PRIMARY KEY ((user_name), posted_time)
) WITH CLUSTERING ORDER BY(posted_time desc);

Now, I can get a feed for a particular user in a single query all fine. What if the user who has posted a feed updates his profile pic. How do I go about updating the data in user_feed table?


Solution

  • You can use batch statements to achieve atomicity at your updates. So in this case you can create a batch with the update on tables users and user_feed using the same user_name partition key:

    BEGIN BATCH
        UPDATE users SET profile_pic = ? WHERE user_name = ?;
        UPDATE user_feed SET posted_by_profile_pic = ? WHERE user_name = ?;
    APPLY BATCH;
    

    Take a look at CQL Batch documentation