Cassandra 和社交“取消好友”/“取消关注”

Dra*_*una 5 cql cassandra

介绍

我开始更多地了解 Cassandra 并创建了一个简单的社交网络(类似于 Instagram/Facebook)。

一般的想法是,您可以关注/加好友并在提要中查看他们的更新。启动应用程序时,您应该能够滚动提要(按时间排序的更新)并对其进行分页。

在我的情况下,我坚持使用扇出方法 - 每当发布更新时,它都会被推送到朋友/关注者的提要中。

这是我的架构的样子。

CREATE TABLE feed_by_time (
    user_id uuid,
    time timestamp,
    author_id uuid,
    post_id uuid,
    PRIMARY KEY  (user_id, time, author_id)
) WITH CLUSTERING ORDER BY (time DESC);
Run Code Online (Sandbox Code Playgroud)

有了这张表,我应该能够轻松地按排序顺序获取任何用户的提要,并进一步对其进行分页,并且每个用户的提要都将驻留在自己的分区中,因此我不会从多个节点获取。我受到每个分区的潜在大小的限制,但让我们假设现在这不是问题。

问题

现在,实际问题 - 应该如何实现取消关注/取消好友功能?它假设特定“作者”的所有帖子都应该从您的提要中消失。

我知道使用该feed_by_time表我将无法删除特定“作者”的所有帖子,因此我可以有另一个类似的帖子:

CREATE TABLE feed_by_author (
    user_id uuid,
    author_id uuid,
    post_id uuid,
    time timestamp,
    PRIMARY KEY ((user_id, author_id), post_id)
);
Run Code Online (Sandbox Code Playgroud)

并在发布新帖子时同时写信给他们。

当我取消关注某人时,我可以做类似的事情

  1. SELECT * FROM feed_by_author WHERE user_id="user_id" AND author_id="unfriended_id"
  2. 提取time查询结果条目并运行大量DELETE查询feed_by_time
  3. 运行一个 bigDELETE来清理feed_by_author(在这种情况下它将删除整个分区)

我的担心主要围绕第二点。我读到我应该避免这样的删除,因为它们非常昂贵。那么,我是否应该担心,是否有更有效/正确的方法来做到这一点?拥有一deleted列并将其值设置为 1UPDATE会更有效吗?

跟进

作为这个问题的后续 - 比如说,我重新关注/重新与某人成为朋友。这将导致大量INSERT进入feed_by_time用户特定的分区,因为我们将有效地将整个作者提要合并到用户提要中。time每个帖子上的值可能有很大差异,因此我们可以将其插入分区的“中间”。在性能方面成本高吗?

谢谢!:)

Tch*_*Tch -1

你应该有一张桌子friendships

user_id
friend_id
Run Code Online (Sandbox Code Playgroud)

和一张桌子posts

post_id
user_id
post_text
date
Run Code Online (Sandbox Code Playgroud)

跟随:

insert into friendships ( user_id, friend_id) values (whatevermyid, whateverfriendid)
Run Code Online (Sandbox Code Playgroud)

当你想获取用户的提要时:

select post_id, post_text, date, friend_id from friendships f join posts p on f.friend_id=p.user_id and f.user_id=whatevermyid order by date desc
Run Code Online (Sandbox Code Playgroud)

当您取消关注某人时:

delete from friendships where friend_id=whateverfriendid and user_id=whatevermyid
Run Code Online (Sandbox Code Playgroud)

这实际上是一个记录