【问题标题】:setting up a friend list in mysql在mysql中设置好友列表
【发布时间】:2011-06-08 02:57:13
【问题描述】:

我想在我的在线游戏中创建一个好友列表。我不确定如何设置或从哪里开始。添加朋友和接受朋友部分我可以处理,但我不知道如何在mysql和php中设置它。连接到每个用户或其他东西的用户(朋友)列表?

【问题讨论】:

    标签: php mysql database database-design


    【解决方案1】:

    如果您的友谊关系是对称的,您可以将每一对存储在单独的记录中:

    friend1 friend2
    A       B
    B       A
    A       C
    B       D
    C       B
    D       B
    

    然后像这样查询B的所有朋友:

    SELECT  friend2
    FROM    friends
    WHERE   friend1 = 'B'
    

    或将id 最小的用户存储在第一个字段中,将id 最大的用户存储在第二个字段中:

    friend1  friend2
    A        B
    A        C
    B        D
    

    然后这样查询B的朋友:

    SELECT  friend1
    FROM    friends
    WHERE   friend2 = 'B'
    UNION ALL
    SELECT  friend2
    FROM    friends
    WHERE   friend1 = 'B'
    

    第一个选项在MySQL 中效率更高一些,如果您的友谊关系不对称(如LiveJournal),这是唯一的选项

    见这篇文章:

    【讨论】:

    • 是否需要在关系表上分配主键?
    • @Mike:你当然会这样做,以消除重复并加快搜索速度。关系表也可以有自己的属性(如建立友谊的日期等)。
    • 如果我理解正确,您说的是复合主键,对吧?主键和外键都引用回“用户”表。
    • @MikeSanchez: CREATE TABLE friendship(a INT NOT NULL REFERENCES users, b INT NOT NULL REFERENCES users, PRIMARY KEY (a, b))
    【解决方案2】:

    友谊本质上是两个人之间的相互关系。在数据库术语中,它是两个用户之间的多对多关系。

    因此,您需要一个链接表,其中包含按 ID 对两个用户的引用。

    示例

    用户表

    ID    Username
    1     Bob
    2     Jim
    3     Alice
    

    朋友桌

    user1    user2
    1        2
    2        3
    

    这将使 Bob 成为 Jim 的朋友,Jim 成为 Alice 的朋友。

    【讨论】:

    • 嗨@robinjam!只是想和你核实一下。如果我的朋友列表是对称的,应该是这样的:如果 1 是 2 的朋友,那么 2 是 1 的朋友。在表中为它们的关系创建 2 行条目。谢谢!
    • Mike Sanchez:Friends 表模拟了相互的友谊,因此您需要每个友谊 1 行,而不是每个人 1 行。
    • 我打算在 php+mysql 环境中尝试使用这种设置。如果我错了,请纠正我,但是按照您的设置,我将不得不使用 UNION。与在表中创建 2 个条目相反,我可以只使用一个 WHERE user1="1" 语句。
    • Mike Sanchez:取决于你想要做什么。你能打开一个新问题而不是在这个问题上发布 cmets 吗?
    【解决方案3】:

    在 stackoverflow 上的其他帖子中查看答案...一些简单但很好的解释来完成您需要的。

    Facebook database design?

    【讨论】:

      【解决方案4】:

      另一种方法是将 A 列设置如下: $checkfriend = (($friend1 $friend2) || ($friend2 $friend1))

      B 列如下: (接受友谊或拒绝友谊)基于用户的选择

      基本上user1和user2都在同一列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多