我有两张桌子:
posts : {post_id, text}
这将按其ID存储所有帖子。另一个表存储喜欢的数量,每个帖子的评论:
counts: {post_id, likes, comments}
我有另一张表来映射已经喜欢帖子的用户,这样通过检查这里的条目我们可能/可能不允许再次喜欢
post_like_user: {post_is, user_id}
最后一个是每个帖子的评论表:
comments: {post_id, comment_id, comment_text, }
所以用例是:
如果用户在comments
故事中发表任何评论,请增加comments
表格中的counts
计数。
如果用户喜欢帖子检查第一个post_like_user
表,如果该条目不存在,则递增likes
表中的counts
计数,在{{{}}中插入用户ID 1}}表。
这些用例是否由生产中的cassandra / mongodb处理?如何在cassandra / mongodb中实现这些用例,因为它不支持ACID?
答案 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。
这种情况可能存在问题:
post_like_user
表中的数据不一致,或者您必须提供强大的一致性,这将使您获得一些性能。最好避免检查和更新'行为:不要对计数器使用单独的表,并使用count()
函数通过post:
SELECT COUNT(*) FROM post_like_user where post_id='post id';
此请求应该非常快,因为它将在一个分区内执行(如果post_id是分区键)
另一种方法是使用单独的counts
表,但在后台进程中更新它,后台将定期请求“喜欢”。从post_like_user
表按count(*)
函数计算,并将计数放入counts
表。