社交网络的 SQL 建模追随者/被关注关系

Posted

技术标签:

【中文标题】社交网络的 SQL 建模追随者/被关注关系【英文标题】:SQL Modeling Follower/Followed Relationships For Social Networking 【发布时间】:2012-04-07 19:30:24 【问题描述】:

我正在为我的网站构建社交图谱。用户将创建关系(形式为追随者/被追随者),其中每一方都可以独立地追随另一方。我的用户表如下所示:

Users table
 - UserId (PK, Auto-incrementing integer)

考虑到如何对此进行建模,我想出了几个替代方案,例如:

(a) 表格将每个“关注”操作作为单独的行保存。

Relationships table
 - FollowerId (FK to Users.UserId)
 - FollowedId (FK to Users.UserId)

这有一个缺点,即给许多用户,它会创建大量的行。

(b) 一个表格以 CSV 或其他结构形式保存每个用户关注的用户列表:

Relationships table
 - FollowerId (FK to Users.UserId)
 - FollowingUsers (e.g. 2,488,28,40)

这有一个缺点,即查询会更加复杂(而且成本很高?)。我还必须保持字符串值的顺序等...

(c) 每行的关系,其中用户可能位于关系的“一侧”:

Relationships table
 - Party1Id (FK to Users.UserId)
 - FollowingParty2 (boolean)
 - Party2Id (FK to Users.UserId)
 - FollowingParty1 (boolean)

这比 (a) 节省了行,但查询更复杂,因为用户可能是任何一方。

(d) 将 'following' 和 'followed by' 放置为类似 (b) 的列表

Relationships table
 - UserId (FK to Users.UserId)
 - FollowingUsers (e.g. 2,488,28,40)
 - FollowedBy (e.g. 2,488,28,40)

这似乎是世界上最好的,但现在我必须使用事务来更新多行。

假设我希望扩大规模,尽管我知道“Facebook 的问题不是我的问题” - 首选哪个选项或其他哪个选项?

【问题讨论】:

【参考方案1】:

我会选择选项 A。

    使用其他选项将无法进行任何类型的社交图谱分析 使用其他选项将无法强制执行任何类型的关系约束 如果您不打算以关系方式存储数据,则无需使用关系数据库。

一个有趣的选择可能是考虑关系表模型:

关系表

RelationshipId UserId(FK 到 Users.UserId) 关系类型

您现在可以连接用户了。

案例 B 遵循 A:

添加RelationshipId1、UserAId、“IsFollowed” 添加RelationshipId1、UserBId、“IsFollowing”

case 另一个用户开始关注 A:

添加RelationshipId1、AnotherUserId、“IsFollowing”

case 另一个用户开始关注 B:

添加RelationshipId2、AnotherUserId、“IsFollowing”

如果您愿意,您甚至可以消除不需要的行: A 从 B 开始:

添加RelationshipId3、UserAId、“IsFollowedAndIsFollowing” 添加RelationshipId3、UserBId、“IsFollowedAndIsFollowing” 删除RelationshipId1、UserBId、“IsFollowing”

【讨论】:

以上是关于社交网络的 SQL 建模追随者/被关注关系的主要内容,如果未能解决你的问题,请参考以下文章

Postgres如何使2个数字字段彼此唯一

Python实现社交网络可视化,看看你的人脉影响力如何

图的表示:如何存储微博、微信等社交网络中的好友关系?

Python 实现社交网络可视化,看看你的人脉影响力如何

《在线社交网络》

社交网站的数据库设计