SQL好友功能

时间:2009-01-23 22:21:26

标签: sql

构建朋友“功能”的最佳方法是什么。
这就是我的想法: 让我说我有一个usertable与以下列:user_id,用户名,密码... 以及包含列的朋友名称的表格:friend1,friend2,accepted。

如果user2添加了user1,我希望user2显示在user1的配置文件中,user1显示在user2的...:O

这看起来有点混乱......有更聪明的方法吗?

3 个答案:

答案 0 :(得分:4)

CREATE TABLE (friend_id_a, friend_id_b, accepted)

定义约束:friend_id_a < friend_id_b

使用您的实体填充表格,如下所示:

INSERT
INTO friend_friend(friend_id_a, friend_id_b)
VALUES (LEAST(@id1, @id2), GREATEST(@id1, @id2))

选择一个人的所有朋友:

SELECT friend_id_b
FROM friend_friend
WHERE friend_id_a = @id
 AND accepted
UNION ALL
SELECT friend_id_a
FROM friend_friend
WHERE friend_id_b = @id
 AND accepted

UNION ALL允许您使用索引并避免对唯一性进行额外排序。

上述所有内容对于“友谊”都是有效的,因为它是一种对称和反身的关系。这意味着:

  • 如果 a b 的朋友,那么 b a

  • 的朋友
  • a 绝不是 a

  • 的朋友

答案 1 :(得分:1)

我认为你的设计很好。第二个表friends(主键friend1friend2),如果f1f2之间存在友谊,则会出现行f1f2 accepted即将建立“,f1如果实际已经建立则为真,是表示多对多关系的正确方式。

(天真方法的唯一问题是当你必须检查 f2f1的朋友时:这可能意味着行{{1 }},f2存在,f2f1为Quassnoi的+1。克服此困难。)

答案 2 :(得分:1)

我不知道你的意思是一个庞大的桌子,每个朋友有一个列,或者下面有两个表,但后者是最好的。

[dbo].[Users]{
    User_ID int,
    UserName VarChar,
    Password ...
}

[dbo].[Friends]{
    User1_ID int,
    User2_ID int,
    Accepted bit
}