2017-05-23 66 views
1

我正在嘗試使用Cassandra構建新聞饋送系統,我正在考慮使用扇出方法,其中如果用戶發佈新帖子,我會在他的所有文章中寫入新記錄朋友的飼料表。表結構看起來像:更新Cassandra中的非規範化數據

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

現在,我可以得到一個特定用戶的飼料在單個查詢中一切正常。如果發佈Feed的用戶更新了他的個人資料照片,該怎麼辦?我如何去更新user_feed表中的數據?

+0

你'users'表看看顯示的'主鍵user_id'但是沒有'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