1

继续这个问题

在我的网络应用程序中,我希望允许用户添加朋友,例如 facebook,在我之前的问题中,我最终决定使用 @yiding 所说的数据库结构:

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

缺点是它的大小是两倍,并且在建立和破坏友谊时必须进行 2 次写入。优点是您的所有读取查询都更简单。这可能是一个很好的权衡,因为大多数时候你是在阅读而不是写作。

这还有一个额外的好处,如果您最终超出了一个数据库并决定进行用户分片,您不必遍历所有其他数据库分片来找出一个人的朋友是谁。

所以,现在如果用户 1 添加用户 2,用户 5 添加用户 2,类似这样的内容将进入数据库:

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

如您所见,我们首先插入“ REQUEST SENDER ”行,所以现在假设用户5已登录,我们想向他显示友谊请求,这是我的查询:

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

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

我应该如何正确检查这个?

4

3 回答 3

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'

就这样。

于 2012-12-25T14:13:02.343 回答
0

您需要持有一个临时表(或固定的 - 用于数据挖掘),其中包含一个用户向另一个用户发出的所有请求,例如:

表:朋友请求

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

假设 0 未获批准。

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

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

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

您还可以通过查找非相互友谊来查询这种不对称关系,其中用户有很多关注者。

于 2012-12-26T08:30:12.287 回答
0

友谊查询通知应放置在消息收件箱之类的地方。你描述的关系是为了保持友谊关系,而不是事件本身发生的事实。您应该考虑创建关系以保留通知并将其与两个插入一起正确填写friends_tbl

于 2012-12-25T14:30:52.893 回答