mysql - 建模社交应用程序:按我关注的用户订购“喜欢”
问题描述
背景:
- Instagram 允许用户查看喜欢任何帖子的人的完整列表
- 'likers' 列表进行了排名,以便您关注的人总是一起出现在喜欢列表的顶部
- 即使对于拥有超过 1000 万个赞的帖子和关注超过 1,000 人的用户,这也能立即生效
我应该如何建模我的数据(最好是在 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
但这似乎会导致大量冗余数据
解决方案
最简单的方法之一是加入 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 时计算和更新排名列
推荐阅读
- python - 下载base64图像数据并保存到内存中
- scala - 减少地图的rdd
- php - 419 Page Expired 错误,尤其是任何 POST 请求,在网站托管在实时服务器上之后。(拉拉维尔)
- spring-security - 如何在 Spring Security 中的重定向 /cas/login 回调中设置位置
- git - 使用 git 将主分支合并到开发分支时出错
- r - Sample from a skewed distribution in R
- python - 如何在 cpanel 中运行 selenium 自动化脚本
- javascript - Javascript自动更改文本动画
- c++ - 在 std::function 中获取 std::future 的结果类型
- unix - stringtie 指南参考注释错误