2017-05-23 10 views
1

カサンドラを使ってニュースフィードシステムを構築しようとしていますが、ユーザーが新しい投稿を投稿すると、友達のフィードテーブル。テーブルの構造は次のようになります。カサンドラで非正規化データを更新する

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); 

ここで、1つのクエリで特定のユーザーのフィードをすべて取得できます。フィードを投稿したユーザーがプロフィールを更新した場合はどうなりますか? user_feedテーブルのデータを更新するにはどうすればよいですか?

+0

あなた 'users'テーブルを見てみましょう'の主キーを示していuser_id'の列はありません。 – markc

+0

申し訳ありませんが、プライマリキーはuser_name – gameOne

+0

です。つまり、ユーザーが自分のプロフィール画像を更新すると、「プロフィール更新」イベントとして 'user_feed'テーブルにも移動しますそれはありませんか? – markc

答えて

1

バッチステートメントを使用して、更新時にアトミック性を実現できます。したがって、この場合には、あなたは同じuser_nameパーティション・キーを使用して、テーブルusersuser_feedに更新してバッチを作成することができます。

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

CQL Batch documentation

+0

user_feedテーブルでは、user_name列はフィードが入力されるユーザーのものであり、ユーザーではありません投稿を投稿しました。プロフィールの写真の列は投稿者のもので、動作しません。 – gameOne

+0

スキーマを変更したくない場合は、同じパス(//current_profile_pic)で最新の画像を保存する方法がありますので、レコードの更新を続ける必要はありません。 –

+0

これはいい考えですが、その場合にのみ機能します。たとえば、ユーザーが投稿を編集し、友人のフィードのすべての列で投稿内容を更新する必要があります。私はあなたがより良いものを提案できる場合に備えてスキーマを変更したいと思います。 – gameOne

関連する問題