在社交网络数据库中存储朋友

Nyx*_*yxx 9 mysql sql database facebook social-networking

为了在社交网络中存储朋友关系,最好是让另一个表有列,relationship_id, user1_id, user2_id, time_created, pending或者将确认好的朋友的user_id分解/内爆成单个长字符串并与其他用户详细信息一起存储,user_id, name, dateofbirth, address并限制为仅限5000个类似的朋友到Facebook?

有没有更好的方法?第一种方法将创建一个巨大的表!第二个有一列非常长的字符串......

在每个用户的个人资料页面上,他的所有朋友都需要从数据库中检索,以显示类似于Facebook的30个朋友,所以我认为使用单独表格的第一种方法会导致大量的数据库查询?

Mik*_*ron 13

合适的方法是拥有会员表(显然),以及第二个朋友关系表.

你不应该永远保存在那样的字符串的外键.重点是什么?您不能加入它们,对它们进行排序,对它们进行分组,或者首先证明拥有关系数据库的任何其他东西.

如果我们假设Member表看起来像这样:

MemberID int Primary Key
Name varchar(100) Not null
--etc
Run Code Online (Sandbox Code Playgroud)

然后您的友谊表应如下所示:

Member1ID int Foreign Key -> Member.MemberID
Member2ID int Foreign Key -> Member.MemberID
Created datetime Not Null
--etc
Run Code Online (Sandbox Code Playgroud)

然后,您可以将表连接在一起以提取朋友列表

SELECT m.*
FROM Member m
RIGHT JOIN Friendship f ON f.Member2ID = m.MemberID
WHERE f.MemberID = @MemberID
Run Code Online (Sandbox Code Playgroud)

(这特别是SQL Server语法,但我认为它非常接近MySQL.这@MemberID是一个参数)

这总是比分割字符串和进行30次额外的SQL查询以提取相关数据更快.

  • 随机注意:如果您的友谊图是无向的(即在此示例实现中您可以使用`Member2ID`交换`Member1ID`),那么您可能需要引入约束`Member1ID <Member2ID`.通过这种方式,您可以检查两个成员是否是具有单个查找`(lowerID,higherID)`的朋友,而不需要两个查找`(lowerID,higherID)OR(higherID,lowerID)`.这也意味着一个成员不能与他/她自己成为朋友. (10认同)