在cassandra中处理多表事务

时间:2018-03-29 03:51:09

标签: mongodb cassandra

我有两张桌子:

posts : {post_id, text}

这将按其ID存储所有帖子。另一个表存储喜欢的数量,每个帖子的评论:

counts: {post_id, likes, comments}

我有另一张表来映射已经喜欢帖子的用户,这样通过检查这里的条目我们可能/可能不允许再次喜欢

post_like_user: {post_is, user_id}

最后一个是每个帖子的评论表:

comments: {post_id, comment_id, comment_text, }

所以用例是:

  1. 如果用户在comments故事中发表任何评论,请增加comments表格中的counts计数。

  2. 如果用户喜欢帖子检查第一个post_like_user表,如果该条目不存在,则递增likes表中的counts计数,在{{{}}中插入用户ID 1}}表。

  3. 这些用例是否由生产中的cassandra / mongodb处理?如何在cassandra / mongodb中实现这些用例,因为它不支持ACID?

2 个答案:

答案 0 :(得分:1)

Cassandra有一个批量概念,它与交易非常相似(至少从描述中)。链接到文档:https://docs.datastax.com/en/cql/3.3/cql/cql_using/useBatchGoodExample.html

基本上你要做的是:

BEGIN LOGGED BATCH
// do your dml
APPLY BATCH;

答案 1 :(得分:1)

  

如果某个用户喜欢使用帖子检查第一个post_like_user表,如果该条目不存在,则递增计数表中的likes count计数在post_like_user表中插入用户ID。

这种情况可能存在问题:

  1. 比赛条件。 '检查并更新'将不会作为原子操作执行。在Cassandra中,没有办法在几个表和几个操作之间提供原子性。
  2. 复制品之间post_like_user表中的数据不一致,或者您必须提供强大的一致性,这将使您获得一些性能。
  3. 最好避免检查和更新'行为:不要对计数器使用单独的表,并使用count()函数通过post:

    获取喜欢的数量
    SELECT COUNT(*) FROM post_like_user where post_id='post id';
    

    此请求应该非常快,因为它将在一个分区内执行(如果post_id是分区键)

    另一种方法是使用单独的counts表,但在后台进程中更新它,后台将定期请求“喜欢”。从post_like_user表按count(*)函数计算,并将计数放入counts表。