简介
我越来越了解卡桑德拉,并创建了一个简单的社交网络(类似于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)
);
并在发布新帖子的同时给他们写信。
当我取消关注某人时,我可以做一些类似的事情
SELECT * FROM feed_by_author WHERE user_id="user_id" AND author_id="unfriended_id"
- 为查询结果条目提取
time
,并对feed_by_time
运行大量DELETE
查询 - 运行一个大的
DELETE
来清理feed_by_author
(在这种情况下,它将删除整个分区(
我担心的主要是第二点。我读到我应该避免这样的删除,因为它们非常昂贵。那么,我应该担心吗?有更有效/正确的方法吗?有一个deleted
列,并通过UPDATE
将其值设置为1会更有效吗?
跟进
作为这个问题的后续——比如说,我重新关注/成为某人的朋友。这将导致大量feed_by_time
0进入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
实际上是一个记录