如何塑造友谊关系

时间:2011-10-06 01:54:25

标签: mysql database-design relationships table-structure

我一直试图弄清楚如何做到这一点,即使查看其他例子,我也无法理解,所以也许我可以得到一些个性化的帮助。

我有两张桌子,users_statusfriendships

users_status表格中,我有一个字段userid和其他几个字段。 在friendships表格中,我有字段request_torequest_fromfriendship_status

基本上我想要做的是获取当前用户的所有状态帖子以及当前用户的朋友(我可以使用$ userid变量在我的PHP中指定)。

以下是friendships表结构的示例。当发送好友请求时,发送者和接收者的用户ID被放在表中,friendship_status为0.当请求被接受时,friendship_status被设置为1,而这两个现在是朋友。

friendship_id   request_from    request_to  friendship_status
1               111248          111249      1
2               111209          111249      1
3               111209          111248      0
11              111209          111259      1
5               111252          111209      1
12              111261          111209      1

我意识到这甚至可能不是确定友谊的最佳结构,特别是因为该网站是基于关系的,并且必须检查友情关系将是一个经常使用的东西。

friend_requestsfriendships设置两个单独的表可能会更好吗?如果是这样,我将如何构建/管理friendships表?

2 个答案:

答案 0 :(得分:4)

您可以使用表格连接(例如http://dev.mysql.com/doc/refman/5.0/en/join.html)来查找所有请求。

实际上你可以在这里使用子查询:

SELECT * FROM users_status WHERE userid = "$userid" 
    OR userid in (SELECT request_to   FROM friendships where request_from = "$userid" AND friendship_status = 1)
    OR userid in (SELECT request_from FROM friendships where request_to   = "$userid" AND friendship_status = 1)

$userid替换为您的用户ID

答案 1 :(得分:3)

我能想到的最简单的架构是:

PENDING_FRIENDSHIPS(request_from, request_to)
FRIENDSHIPS(request_from, request_to)

我还删除了ID,因为两个表上的两个字段都是复合主键(request_from,request_to)。

要让当前用户的所有朋友运行:

select * from friendships
where $currentUser = request_from OR $currentUser = request_to

这将返回两列,您必须在PHP中删除当前用户。

从此架构中获取所有朋友的另一种方法是运行UNION:

select request_from from friendships
where request_to = $currentUser
UNION
select request_to from friendships
where request_from = $currentUser

此解决方案的缺点是您正在运行2个选择