检查用户友谊

时间:2012-12-25 14:04:21

标签: php mysql database-design

继续this question

在我的网络应用中,我想允许用户在我之前的问题中添加朋友,比如facebook,我最终决定将数据库结构设为@yiding说:

  

我会对关系进行去规范化,使其对称。那是,   如果1和2是朋友,我会有两行(1,2)和(2,1)。

     

缺点是它的尺寸是它的两倍,你必须做2   在形成和打破友谊时写道。优点是全部   您的阅读查询更简单。这可能是一个很好的权衡   因为大部分时间你都在阅读而不是写作。

     

这有一个额外的好处,如果你最终超过一个   数据库并决定做用户分片,你不必遍历   每隔一个db分片就可以找出一个人的朋友是谁。

所以,现在如果用户1添加了用户2,而用户5添加了2,那么这样的内容将进入db:

ROW_ID    USER_ID   FRIEND_ID   STATUS
1         1         2           0
2         2         1           0
3         5         2           0
4         2         5           0

如您所见,我们首先插入“请求发送者”的行,现在想象用户5已登录,我们想向他显示友情请求,这是我的疑问:

$check_requests = mysql_query("SELECT * FROM friends_tbl WHERE FRIEND_ID = '5'");

上面的查询,将获取ROW_ID = 4,这意味着用上面的查询向我们显示用户2已经添加了5,但他没有,实际上用户5添加了用户2,所以这里我们不应该显示任何友情请求对于用户5,我们需要为用户2显示它。

我应该如何正确检查?

3 个答案:

答案 0 :(得分:2)

这是一个经过编辑的答案。


您的SQL查询应如下所示:

SELECT USER_ID, FRIEND_ID FROM friends_tbl WHERE FRIEND_ID = '5' OR USER_ID = '5'

然后你必须以这种方式解析你的结果。假设你有一个像这样的php数组:

$result = array(
    0 => array(
        'USER_ID' => 5,
        'FRIEND_ID' => 2
    ),
    1 => array(
        'USER_ID' => 2,
        'FRIEND_ID' => 5
    )
    2 => array(
        'USER_ID' => 5,
        'FRIEND_ID' => 8
    ),
    3 => array(
        'USER_ID' => 8,
        'FRIEND_ID' => 5
    )
)

你只需得到偶数行:

$result_final = array();
for($i = 0; $i < count($result); $i++) {
    if($i % 2 == 0) $result_final[] = $result[$i];
}

然后你会得到一个这样的数组:

    $result = array(
    0 => array(
        'USER_ID' => 5,
        'FRIEND_ID' => 2
    ),
    1 => array(
        'USER_ID' => 5,
        'FRIEND_ID' => 8
    )
)

替代方法:让您的SQL看起来像这样:

SELECT FRIEND_ID FROM friends_tbl WHERE USER_ID = '5'

就是这样。

答案 1 :(得分:0)

友情查询通知应放在消息收件箱之类的内容中。你所描述的关系意味着保持友谊关系,而不是事件发生的事实。您应该考虑创建关系以保持通知并在friends_tbl

上使用两个插入正确填充它

答案 2 :(得分:0)

您需要持有一个临时表(或用于数据挖掘的固定表),该表具有从一个用户到另一个用户的所有请求,例如:

表:friendRequest

inviterId inviteeId status tstamp 
    2           5       0    NOW()
    5           8       0    NOW()

假设0未获批准。

您将查询所有待处理的请求

SELECT * FROM friendRequest WHERE invitee_id = :currentLoggedUserId AND status = 0

用户批准用户后,您将创建一个事务,描述这个新形成的关系并更新friendRequests表

你也可以通过寻找不相互的友谊来查询这种方式,即用户有很多粉丝的不对称关系。