社交网络数据库设计 - 朋友/块关系
Posted
技术标签:
【中文标题】社交网络数据库设计 - 朋友/块关系【英文标题】:Social Network Database Design - Friend/Block Relationships 【发布时间】:2011-09-28 21:18:41 【问题描述】:我正在开发一个社交网站,我需要用户能够互相加为好友和/或互相屏蔽。在我看来,2 个用户可以是 Friend、Pending、Block 或 NULL。我想要一个视图,为每个已确认的关系显示一行。我的视图正确显示了关系,但我不得不采取一种解决方法,只显示 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
有人觉得更好吗?
【讨论】:
如果有不止一种关系,例如朋友、家人、技术人员、追随者……等等? 是的,我之前没有意识到!以上是关于社交网络数据库设计 - 朋友/块关系的主要内容,如果未能解决你的问题,请参考以下文章