我开始更多地了解 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)
并在发布新帖子时同时写信给他们。
当我取消关注某人时,我可以做类似的事情
SELECT * FROM feed_by_author WHERE user_id="user_id" AND author_id="unfriended_id"
time
查询结果条目并运行大量DELETE
查询feed_by_time
DELETE
来清理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)
这实际上是一个记录
归档时间: |
|
查看次数: |
282 次 |
最近记录: |