卡桑德拉与社交"取消好友"/"取消关注"



简介

我越来越了解卡桑德拉,并创建了一个简单的社交网络(类似于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);

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

问题

现在,实际的问题是如何实现unfollow/unfriend功能?它假设一个特定的";作者"应该从你的订阅源中消失。

我知道使用CCD_ 1表;作者"这样我就可以有另一个类似的:

CREATE TABLE feed_by_author (
user_id uuid,
author_id uuid,
post_id uuid,
time timestamp,
PRIMARY KEY ((user_id, author_id), post_id)
);

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

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

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

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

跟进

作为这个问题的后续——比如说,我重新关注/成为某人的朋友。这将导致大量feed_by_time0进入feed_by_time用户特定分区,因为我们将有效地将整个作者提要合并到用户提要中。每个帖子上的time值可能变化很大,因此我们可以将其插入";中间的";分区的。就性能而言,成本高吗?

谢谢!:(

您应该有一个表friendships

user_id
friend_id

和表CCD_ 14

post_id
user_id
post_text
date

遵循:

insert into friendships ( user_id, friend_id) values (whatevermyid, whateverfriendid)

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

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

当你取消关注某人时:

delete from friendships where friend_id=whateverfriendid and user_id=whatevermyid

实际上是一个记录

最新更新