2011-09-28 65 views
1

我正在开发一个社交网站,并且需要用户能够互相交流和/或互相阻止。我看到它的方式,2用户可以是朋友,待定,NULL。我希望有一个视图为每个确认的关系显示一行。我的观点正确地显示了这种关系,但我必须做一个解决方法,只显示1行/关系而不将表与自己联合起来,并交换订单或请求者和请求者。社交网络数据库设计 - 朋友/座位关系

任何人有关于如何清理这个了吗?

感谢, - 格雷格

关系表:

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

vwRelationship检视:

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凡(用户a = 1并且用户B = 2)或(用户a = 2,用户B = 1)

场景:

  1. 用户1和用户2不知道对方|关系类型= NULL
  2. 用户1位朋友用户2 |关系类型= 待定
  3. 用户2接受|关系类型= 朋友
  4. 一个月之后用户2块用户1 |关系类型=
+2

我看到三个问题。首先,表格似乎是关于友谊的地位,如果是这样的话,为友谊的开始存储时间戳似乎错位了。其次,你不记录谁设置了一个块,所以你不能告诉谁应该被允许删除它。第三,“封锁”似乎是一种与“朋友”和“待定”完全不同的信息。 –

+1

“受阻”与“不友好”意味着什么? –

+0

@Catcall认为我应该把它分成3个表格? (friend,pending,block)我可以确定谁在请求者字段设置了块,但是整个事情看起来太乱了 – Greg

回答

2

这里是我最终使用:

Table - Relationship 
RelationshipID, RelationshipTypeID, CreatedByUserID, CreatedTimestamp 

Table - RelationshipType 
RelationshipTypeID, RelationshipTypeName 

Table - UserRelationship 
UserID, RelationshipID, IsPending 

有人想到什么好?

+0

拥有多个关系,比如朋友,家人,科技,关注......等等,怎么样? –

+0

听起来像那些只是不同的'RelationshipTypeID's ... – Greg

+0

是啊,我没有意识到它之前! –