【问题标题】:How to model Friendship relationships如何建立友谊关系模型
【发布时间】:2011-12-01 22:44:55
【问题描述】:

我一直在尝试弄清楚如何做到这一点,即使查看了其他示例,我也无法弄清楚,所以也许我可以获得一些个性化的帮助。

我有两张桌子,users_statusfriendships

users_status 表中,我有一个字段userid,还有其他几个字段。 在friendships 表中,我有request_torequest_fromfriendship_status 字段。

基本上我想做的是获取当前用户和当前用户朋友的所有状态帖子(我可以在我的 PHP 中使用 $userid 变量指定)。

这是friendships 表结构的示例。发送好友请求时,将发送者和接收者的userid放在表中,friendship_status为0。当请求被接受时,friendship_status设置为1,两人成为好友。

friendship_id   request_from    request_to  friendship_status
1               111248          111249      1
2               111209          111249      1
3               111209          111248      0
11              111209          111259      1
5               111252          111209      1
12              111261          111209      1

我意识到这甚至可能不是确定友谊的最佳结构,尤其是因为该网站是基于关系的,并且必须检查友谊连接将是一个经常使用的事情。

friend_requestsfriendships 设置两个单独的表会更好吗?如果是这样,我将如何构建/管理 friendships 表?

【问题讨论】:

    标签: mysql database-design relationships table-structure


    【解决方案1】:

    您可以使用表连接(例如http://dev.mysql.com/doc/refman/5.0/en/join.html)来查找所有请求。

    其实你可以在这里使用子查询:

    SELECT * FROM users_status WHERE userid = "$userid" 
        OR userid in (SELECT request_to   FROM friendships where request_from = "$userid" AND friendship_status = 1)
        OR userid in (SELECT request_from FROM friendships where request_to   = "$userid" AND friendship_status = 1)
    

    用您的用户 ID 替换 $userid

    【讨论】:

    • 我意识到 JOIN 是一种选择,我尝试过,但我不知道如何让它适应我的具体情况。这就是我发布问题的原因。我需要更多个性化的帮助。
    • @vertigoelectric 实际上你不需要加入——一个子查询就足够了。我更新了我的回复
    • 如果用户向当前用户请求他的友谊,并且当前用户接受了,那么此查询将无法正常工作,因为该用户不会作为朋友返回。我说的对吗?
    • @MostyMostacho 是的,您还需要检查另一种情况,这是一个类似的子查询。更新响应
    • @Foo Bah,我也尝试过子查询。我尝试了您的示例,但似乎无法正确检查用户 ID 是否在 request_to 或 request_from 中。我以用户A 的身份对其进行了测试,用户A 向用户B 发送了请求,用户B 接受了它。用户 A 可以看到他自己和朋友的状态帖子,但用户 B 看不到用户 A 的状态帖子,用户 A 向他发送了好友请求,即使他们都是朋友。我在您的示例中交换了request_torequest_from,然后用户A 无法再看到用户B 的帖子,这是预期的逆转(但用户B 仍然可以看到两者,这很奇怪)。
    【解决方案2】:

    我能想到的最简单的架构是:

    PENDING_FRIENDSHIPS(request_from, request_to)
    FRIENDSHIPS(request_from, request_to)
    

    我还删除了 ID,因为两个表上的两个字段都是复合主键(request_from、request_to)。

    要获取当前用户的所有好友,只需运行:

    select * from friendships
    where $currentUser = request_from OR $currentUser = request_to
    

    这将返回两列,您必须在 PHP 中删除当前用户。

    从这个模式中获取所有朋友的另一种方法是运行一个 UNION:

    select request_from from friendships
    where request_to = $currentUser
    UNION
    select request_to from friendships
    where request_from = $currentUser
    

    此解决方案的缺点是您要运行 2 次选择

    【讨论】:

      猜你喜欢
      • 2015-09-14
      • 1970-01-01
      • 2012-10-28
      • 2012-01-27
      • 2016-11-30
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 2015-01-27
      相关资源
      最近更新 更多