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

Posted

技术标签:

【中文标题】社交网络数据库设计 - 朋友/块关系【英文标题】:Social Network Database Design - Friend/Block Relationships 【发布时间】:2011-09-28 21:18:41 【问题描述】:

我正在开发一个社交网站,我需要用户能够互相加为好友和/或互相屏蔽。在我看来,2 个用户可以是 FriendPendingBlockNULL。我想要一个视图,为每个已确认的关系显示一行。我的视图正确显示了关系,但我不得不采取一种解决方法,只显示 1 行/关系,而不将表与自身合并并交换订单或请求者和被请求者。

有人对如何清理这个有任何想法吗?

谢谢, - 格雷格

关系表:

请求者 (int) |被请求者 (int) | ApprovedTimestamp (smalldatetime) | IsBlock(位)

vw关系视图:

SELECT DISTINCT 
                      CASE WHEN f.Requestor < f.Requestee THEN f.Requestor ELSE f.Requestee END AS UserA, 
                      CASE WHEN f.Requestor < f.Requestee THEN f.Requestee ELSE f.Requestor END AS UserB, CASE WHEN b.Requestor IS NULL AND b.Requestee IS NULL 
                      THEN CASE WHEN f.AcceptedTimestamp IS NULL THEN 'Pending' ELSE 'Friend' END ELSE 'Block' END AS Type
FROM         dbo.Relationship AS f LEFT OUTER JOIN
                          (SELECT     Requestor, Requestee
                            FROM          dbo.Relationship
                            WHERE      (IsBlock = 1)) AS b ON f.Requestor = b.Requestor AND f.Requestee = b.Requestee OR f.Requestor = b.Requestee AND f.Requestee = b.Requestor

示例查询:

从 vwRelationship 中选择类型 Where (UserA = 1 AND UserB = 2) OR (UserA = 2 AND UserB = 1)

场景:

    用户 1 和用户 2 互不认识 |关系类型 = NULL 用户 1 好友 用户 2 |关系类型 = 待处理 用户 2 接受 |关系类型 = 朋友 一个月后用户 2 阻止用户 1 |关系类型 =

【问题讨论】:

我看到了三个问题。首先,表格似乎是关于友谊状态的,如果是这样的话,存储友谊开始的时间戳似乎是错误的。其次,你不记录谁设置了一个块,所以你不能告诉谁应该被允许删除它。第三,“屏蔽”似乎是一种与“朋友”和“待定”完全不同的信息。 “被屏蔽”对您而言与“取消好友”有什么不同吗? @Catcall 认为我应该把它分成 3 张桌子? (friend, pending, block) 我可以通过请求者字段确定谁设置了块,但整个事情看起来太乱了 @Catcall 是的,取消好友关系意味着您的关系为空,如果用户被阻止,我不会在搜索结果中显示他们,允许他们查看基本信息等... 然后我看到了四个问题。第四,NULL 表示“不友好”和“他们彼此不认识”。 (连同它的真实含义,就是“这里不存在价值”。) 【参考方案1】:

这是我最终使用的:

Table - Relationship
RelationshipID, RelationshipTypeID, CreatedByUserID, CreatedTimestamp

Table - RelationshipType
RelationshipTypeID, RelationshipTypeName

Table - UserRelationship
UserID, RelationshipID, IsPending

有人觉得更好吗?

【讨论】:

如果有不止一种关系,例如朋友、家人、技术人员、追随者……等等? 是的,我之前没有意识到!

以上是关于社交网络数据库设计 - 朋友/块关系的主要内容,如果未能解决你的问题,请参考以下文章

在社交网络设计中使用外键 - 好/坏?

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

社交网络中的朋友关系

社交网络应用程序数据库设计:如何改进此架构?

基于Firebase的移动应用数据服务器设计

旅游社交网络数据库设计