想知道Facebook如何做"互相朋友"的功能

Pie*_*rre 6 database database-design facebook

我目前正在开发一个应用程序,允许学生管理他们的课程,我真的不知道如何为特定功能设计数据库.客户想要像Facebook一样,当学生显示当前在特定课程中的人员列表时,首先显示与登录用户具有最多相互课程的人.与Facebook功能几乎相同的"朋友建议"带有额外的过滤器.

作为一项附加功能,我想添加一个搜索功能,以允许学生搜索另一个功能,并在搜索结果中首先显示与登录用户具有最多相互课程的人.

我目前使用MySQL,我计划使用Cassandra来实现其他功能,我还使用Memcached进行结果缓存和Sphinx进行搜索.

谢谢.

-

该应用程序是用Python,BTW开发的

我忘了提到标准方法(使用一个很好的MySQL查询用ORDER BY子句计算所有这些)是太慢了.因为读取比读取更频繁,我希望大多数逻辑发生一次,当人们< - >当然添加关系时.

我考虑更新一个特定于一个元组(用户,课程)的"相互课程"计数器,当登录用户加入新课程时(或者当他离开时减少),该计数器将为课程的所有用户增加.

mau*_*ris 5

假设您有一个名为Users且主键为 的表UserID。然后您有一个名为的表,Friends其中有 2 列,分别为UserID(PK) 和FriendUserID

假设您有 2 个用户,分别是 20 和 50。

当 20 添加 50 作为好友时,应用程序会添加一个新行:

INSERT INTO `Friends` (`UserID`, `FriendUserID`) VALUES (20, 50)
Run Code Online (Sandbox Code Playgroud)

当 50 确认友谊时,您添加另一行并交换值:

INSERT INTO `Friends` (`UserID`, `FriendUserID`) VALUES (50, 20)
Run Code Online (Sandbox Code Playgroud)

当您想找到 20 到 50 岁之间的共同朋友时,只需:

SELECT `UserID` FROM `Friends` AS `A`, `Friends` AS B WHERE `A`.`FriendUserID` = 20 AND `A`.`UserID` = `B`.`UserID` AND `B`.`FriendUserID` = 50
Run Code Online (Sandbox Code Playgroud)


iro*_*ggy 4

如果您已经有了解决方案,但问题只是查询的速度,请尝试尽快执行。当用户的友谊发生变化时,重新运行计算这些事情的作业并将所有结果存储起来。当你这么快就需要结果时,不要因为请求而小题大做。如此昂贵的事情只做一次,并且在提出请求之前就做。