建模社交应用程序:按我关注的用户排序“喜欢”

4si2a6ki  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(298)

背景:
instagram允许用户查看喜欢任何帖子的人的完整列表
“喜欢的人”的列表是按顺序排列的,这样你跟踪的人总是出现在“喜欢的人”列表的顶部
即使是喜欢1000多人的帖子和关注1000多人的用户,这种方法也能立即奏效

我应该如何对数据建模(最好是在mysql中)以复制这种类型的功能?

我试过的:
对于我在页面顶部关注的用户的帖子,可以直接返回喜欢的内容:

SELECT uid, date,
EXISTS(SELECT 1 FROM Follows a WHERE a.uid = "1" and a.followsUid = Likes.uid limit 1) as youFollow
FROM Likes WHERE pid = 30 
ORDER BY youFollow DESC, date DESC LIMIT 10

这种方法的问题是,它仍然不会显示我关注的所有用户,他们都喜欢列表顶部的帖子——只显示我关注的给定页面的用户(限制10)。
有没有什么方法可以做到这一点,而不必扫描每一个'喜欢'行的职位?
我唯一能想到的另一种方法是“扇出/收件箱”模式,用户订阅他们所关注的人的喜好。然后我就可以问 select * from LikeEvents where uid IN (people I follow) and postId = pid 但这似乎会导致大量冗余数据

91zkwejq

91zkwejq1#

最简单的方法之一是连接likes表和following表并按结果集排序。例如:

SELECT Likes.uid, Likes.date FROM Likes 
LEFT JOIN Follows ON Follows.uid = 1 AND Follows.followsUid = Likes.uid
WHERE Likes.pid = 30 
ORDER BY Follows.uid DESC, Likes.date DESC LIMIT 10

当然,如果要避免全表扫描,则必须在likes表和follows表上创建索引。例如:

CREATE INDEX likes_pid on Likes(pid);
CREATE INDEX follows_uid on Follows(uid);

另一种方法是在likes表中创建一个rank列,并根据它对结果集进行排序。

SELECT * FROM Likes WHERE Likes.pid = 30 ORDER BY rank DESC, date DESC LIMIT 10

当然,您必须在创建like时计算并更新rank列

相关问题