首页 > 解决方案 > 建模社交应用程序:按我关注的用户订购“喜欢”

问题描述

背景

我应该如何建模我的数据(最好是在 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但这似乎会导致大量冗余数据

标签: mysqldatabase-designgraphdata-modelingsocial

解决方案


最简单的方法之一是加入 Likes 表和 Follows 表并按结果集排序。例如:

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 表中创建一个排名列,并按它对结果集进行排序。

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

自然,您必须在创建 Like 时计算和更新排名列


推荐阅读