Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql PHP-将用户添加为好友_Mysql_Database Design - Fatal编程技术网

Mysql PHP-将用户添加为好友

Mysql PHP-将用户添加为好友,mysql,database-design,Mysql,Database Design,我有一个社交网站,你可以添加朋友。其工作方式如下: 单击添加朋友 将单击的用户添加到 数据库行,如列中的 [鲍勃][弗雷德][123123] 弗雷德在核实中接受了这个秘密 链接,通过电子邮件 然后,这会将另一行放入 反过来说,比如 这是[fred][bob][123123] 然后我可以确定他们是否是朋友,他们是否被接受 然而,这肯定不是正确的方法。我现在很不确定哪种方法可以更好,运行更平稳。您好,您可以试试这种逻辑 假设bob想将fred添加为朋友 bob让fred添加为好友 操作:将数据库

我有一个社交网站,你可以添加朋友。其工作方式如下:

  • 单击添加朋友
  • 将单击的用户添加到 数据库行,如列中的 [鲍勃][弗雷德][123123]
  • 弗雷德在核实中接受了这个秘密 链接,通过电子邮件
  • 然后,这会将另一行放入 反过来说,比如 这是[fred][bob][123123]
然后我可以确定他们是否是朋友,他们是否被接受


然而,这肯定不是正确的方法。我现在很不确定哪种方法可以更好,运行更平稳。

您好,您可以试试这种逻辑

假设bob想将fred添加为朋友

  • bob让fred添加为好友

    操作:将数据库查找表设置为好友:[bob][fred][hide仅在bob接受时才可见]

  • fred在验证后接受请求 操作:使[隐藏]-->[可见]

    现在您已经与用户和朋友建立了关系。[查找表中的每一行都是朋友]

    希望这会有帮助


  • 其实没有对错之分,它是你决定使用的,最终它是你的代码,所以无论你选择什么,它都为你工作

    然而,您是非常正确的,输入两行将是一个非常沉重的开销,并使用额外的空间似乎没有什么好的理由。更简单的是,您可以在数据库中设置另一列:

    user_1
    |
    user_2
    |
    accept_code
    |
    accepted

    user_1
    请求将
    user_2
    添加为好友-您可以设置一个
    accept_code
    在数据库中创建一个条目。将数据库结构设置为将
    accepted
    列设置为define为false。然后,当第一次创建行时,用户当前不是朋友

    用你的例子:鲍勃要求弗雷德做朋友。现在,您的DB将如下所示:

    bob
    |
    fred
    |
    123123
    |
    false

    user_2
    输入
    accept_code
    时,将
    accepted
    更改为true

    bob
    |
    fred
    |
    123123
    |
    true

    这样,一个查询将告诉您这两个用户是否是朋友,而不是两个查询来查看是否有两个匹配的DB条目

    例如,bob将fred、joe和alex添加为朋友,fred和alex接受bob作为朋友,但joe没有。您的DB将如下所示:

    user_1
    |
    user_2
    |
    accept_code
    |
    accepted

    bob
    |
    fred
    |
    123123
    |
    true

    bob
    |
    joe
    |
    321321
    |
    false

    bob
    |
    alex
    |
    789789
    |
    true

    例如,一个psuedo选择maybe,查找bob的所有朋友:

    从user_1=“bob”和accepted=“true”之间的关系中选择user_2

    结果将是:

    fred
    alex

    根据评论更新:

    数据库结构:

    user_1
    |
    user_2
    |
    accept_code
    |
    accepted

    bob
    |
    fred
    |
    123
    |
    true

    bob
    |
    alex
    |
    123
    |
    true

    bob
    |
    joe
    |
    123
    |
    false

    ste
    |
    bob
    |
    123
    |
    true

    joe
    |
    alex
    |
    123
    |
    true

    选择语句:

    从关系中选择*,其中accepted='true'和(user_1='current_user'或user_2='current_user')

    示例1-bob登录,他已请求朋友并被请求为朋友:

    从关系中选择*,其中接受='true'和(用户_1='bob'或用户_2='bob')

    结果是:

    bob
    |
    fred
    |
    123
    |
    已接受

    bob
    |
    alex
    |
    123
    |
    已接受

    ste
    |
    bob
    |
    123
    |
    已接受

    示例2-alex登录,他从未请求过和朋友,但被请求为朋友:

    SELECT*FROM relationships,其中accepted='true'和(user_1='alex'或user_2='alex')

    结果是:

    bob
    |
    alex
    |
    123
    |
    已接受

    joe
    |
    alex
    |
    123
    |
    接受

    示例3-joe登录后,他请求了一个朋友并拒绝了一个朋友:

    从关系中选择*,其中接受='true'和(用户_1='joe'或用户_2='joe')

    结果是:


    joe
    |
    alex
    |
    123
    |
    接受的社交网络数据库关系可能会很快变得非常复杂,尤其是随着流量的增加和请求的涌入。在他们的开发者博客中,Facebook等领先来源提供了大量数据,说明他们如何修改和调整自己的系统,以随着流量的增加而扩展

    没有一种正确的方法可以创建关系-这取决于您的代码结构-但是,可以说,执行两个查询以创建简单的一对一关系并复制数据被正确地认为是不必要的额外开销

    您可以使用两个用户的ID创建一个简单的连接表,一个字段保存发起请求的用户(用户的int主键),另一个字段接收批准请求(也是int主键)
    UserID|Name
    1      Frank
    2      John
    
    RelationshipID|RequestedBy|Receipient|RequestStatus|ConfirmationCode
    (primary key)       1           2        0            (however you format your url strings)
    
    StatusIdentifier|StatusDefinition
    0                 Requested but not yet approved
    -1                Requested and denied (mark for deletion)
    1                 Requested and approved (active friendship)
    
    $sql = 'SELECT Recipient FROM FriendRelationships WHERE RequestedBy = 1 AND RequestStatus = 1';