代码之家  ›  专栏  ›  技术社区  ›  Pierre

想知道Facebook如何提供“共同的朋友”功能

  •  6
  • Pierre  · 技术社区  · 14 年前

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

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

    我目前使用mysql,我计划将cassandra用于其他一些功能,我还使用memcached进行结果缓存,使用sphinx进行搜索。

    谢谢。

    ——

    这个应用程序是用python开发的,btw

    我忘了提到标准方法(使用一个漂亮的mysql查询通过order by子句计算所有这些)太慢了。因此,由于阅读要比阅读频繁得多,因此我希望在添加关系人课程时,大多数逻辑只发生一次。

    我考虑更新一个特定于一个元组(用户、课程)的“共同课程”计数器,当登录的用户加入一个新课程时,该计数器将为课程的所有用户增加(或当他离开时减少)。

    3 回复  |  直到 13 年前
        1
  •  4
  •   ironfroggy    14 年前

    如果您已经有了解决方案,但问题仅仅在于查询的速度,请尽快尝试这样做。当用户的友谊改变时,重新运行一个计算这些东西并存储所有结果的作业。当你如此快速地需要结果时,不要因为请求而运行他的。只做一次这样昂贵的事情,在提出要求之前就做。

        2
  •  4
  •   mauris    14 年前

    假设您有一个名为 Users 主要的关键是 UserID . 那么你有一张叫 Friends 调用了2列 用户标识 (pk)和 FriendUserID .

    假设你有2个用户,20个和50个。

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

    INSERT INTO `Friends` (`UserID`, `FriendUserID`) VALUES (20, 50)
    

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

    INSERT INTO `Friends` (`UserID`, `FriendUserID`) VALUES (50, 20)
    

    如果你想在20到50岁之间找到共同的朋友,只需:

    SELECT `UserID` FROM `Friends` AS `A`, `Friends` AS B WHERE `A`.`FriendUserID` = 20 AND `A`.`UserID` = `B`.`UserID` AND `B`.`FriendUserID` = 50
    
        3
  •  0
  •   ensnare    14 年前

    我将把它分解为(2)个查询,并在python中找到交集:

    #Query 1 - Get the user's friends
    SELECT friend_id FROM friends WHERE user_id = 'my user id'
    
    #Query 2 - Get the users enrolled in the course
    SELECT student_id FROM course_enrollment WHERE course_id = 'course id'
    

    然后在python中找到交集。 然后您可以让数据库进行缓存等…没有任何连接来减慢速度。