我正在探索Cassandra数据库,我遇到了this video,它解释了如何对表进行非规范化来存储注释,它是这样的:
而不是在该表中指向用户的评论表和users_id列写入评论,而另一个表是视频表,而在评论表中,有一列是video_id,指向已评论的视频。
我们将有两个评论表,一个是comments_by_user,另一个是comment_by_video,问题是如何保持这两个表同步?
当用户对视频发表评论时,我们会分别在comments_by_video和comments_by_user中为视频和用户插入评论。但是,如果第二个插入失败怎么办?
我们会在视频上对用户发表评论,但是当我们为该用户选择所有评论时却无法找到该评论?
答案 0 :(得分:1)
您可以使用Batch Statement来实现此目的。但请注意,批处理语句较慢,并且在协调器节点上的常规操作上会产生大约30%的开销。
答案 1 :(得分:0)
一个选项是批处理语句,如前面的答案所述,这将产生性能影响。
另一个选项,我可以想到尝试在写入失败时将一致性级别更改为ANY。一致性为“ANY”,您的数据将在协调器节点中保存一段配置的时间,并在其他负责节点出现时复制到节点。
对于任何失败的写入,请在代码中处理它并将该插入的一致性更改为ANY并再次执行插入。当然,在任何负责的节点获取数据之前,您将无法读取该数据。
function retryWrites(...)
try{
//insert statement
}catch<writeexception>{
//set consistency to ANY
//insert failed statement
//set consistency back to wherever is required.
}
call retryWrites(statement1)
call retryWrites(statement2)