在我的网络应用中,我想允许用户在我之前的问题中添加朋友,比如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显示它。
我应该如何正确检查?
答案 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表
你也可以通过寻找不相互的友谊来查询这种方式,即用户有很多粉丝的不对称关系。