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

Posted

技术标签:

【中文标题】在社交网络的数据库中存储朋友【英文标题】:Storing Friends in Database for Social Network 【发布时间】:2011-07-08 00:29:09 【问题描述】:

为了在社交网络中存储朋友关系,最好有另一个包含列 relationship_id, user1_id, user2_id, time_created, pending 的表,还是应该将已确认朋友的 user_id 序列化/内爆成一个长字符串并与其他用户详细信息一起存储,例如 @987654322 @并限制只喜欢5000个类似facebook的朋友?

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

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

【问题讨论】:

这真的与 phpmysql(特别是)或 Codeigniter 没有任何关系... 我不确定你在这里问什么。我不明白第二个选项。您以前使用过数据库吗?您是否在问有关数据库关系的基本问题?你的问题到底是什么。请把它从社交网络和其他东西的背景中拿出来。让它通用,但给出简短、清晰的例子。那会很好。 :) Trevor:对于第二个选项,我的意思是在存储用户数据的主表中包含一个包含该特定用户朋友的所有用户 ID 的新字段,例如 @ 987654323@ 如果该用户是用户 ID 为 1101, 1102, 1104, 1211 的用户的朋友。当我需要检索用户 ID 时,我会将字符串分解为一个数组并使用它们 【参考方案1】:

正确的方法是使用成员表(显然)和第二个朋友关系表。

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

如果我们假设 Member 表如下所示:

MemberID int Primary Key
Name varchar(100) Not null
--etc

那么你的友谊表应该是这样的:

Member1ID int Foreign Key -> Member.MemberID
Member2ID int Foreign Key -> Member.MemberID
Created datetime Not Null
--etc

然后,您可以将表格连接在一起以拉出朋友列表

SELECT m.*
FROM Member m
RIGHT JOIN Friendship f ON f.Member2ID = m.MemberID
WHERE f.MemberID = @MemberID

(这是专门的 SQL Server 语法,但我认为它非常接近 MySQL。@MemberID 是一个参数)

这总是比拆分字符串并进行 30 次额外的 SQL 查询来提取相关数据要快。

【讨论】:

随机注意:如果您的友谊图是无向的(即在此示例实现中,您可以将Member1IDMember2ID 交换),那么您可能需要引入约束Member1ID < Member2ID。这样,您可以通过一次查找(lowerID, higherID) 来检查两个成员是否是朋友,而不是需要两次查找(lowerID, higherID) OR (higherID, lowerID)。这也意味着成员不能与他/她自己成为朋友。【参考方案2】:

如方法 1 中的单独表格。 方法 2 不好,因为您每次都必须对其进行反序列化并且无法对其进行 JOINS;如果用户更改他的姓名、电子邮件或其他属性,加上 UPDATE 将是一场噩梦。

当然该表会很大,但您可以在 Member11_id 上对其进行索引,将外键设置回您的用户表,并且可以具有静态行大小,甚至可能限制单个用户可以拥有的朋友数量。我认为如果你做得对,mysql不会有问题;即使您的关系表中有几百万行。

【讨论】:

以上是关于在社交网络的数据库中存储朋友的主要内容,如果未能解决你的问题,请参考以下文章

社交网络数据库设计 - 朋友/块关系

MySql vs NoSql - 社交网络评论和通知数据结构和实现

社交网络好友列表、朋友圈、帖子分享的数据库设计[关闭]

观察社交网络行为:记录或填充数据库?

开源社交网络 [关闭]

[CQOI2018] 社交网络