SQL友元函数

SQL友元函数,sql,Sql,构建朋友“功能”的最佳方式是什么 这就是我的想法: 假设我有一个usertable,其中包含以下列:user\u id、username、password。。。 还有一个名为friends的表,列为:friend1,friend2,accepted 如果user2添加user1,我希望user2显示在user1的配置文件上,user1显示在user2的…:O 这看起来有点乱…有更聪明的方法吗 CREATE TABLE (friend_id_a, friend_id_b, accepted) 定

构建朋友“功能”的最佳方式是什么
这就是我的想法: 假设我有一个usertable,其中包含以下列:user\u id、username、password。。。 还有一个名为friends的表,列为:friend1,friend2,accepted

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

这看起来有点乱…有更聪明的方法吗

CREATE TABLE (friend_id_a, friend_id_b, accepted)
定义一个约束:
friend\u id\u a

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

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 here允许您使用索引并避免为唯一性进行额外排序

所有这些对于作为对称和反自反关系的“友谊”都是有效的。这意味着:

  • 如果ab的朋友,那么 ba

  • a永远不是aa的朋友


  • 我认为你的设计很好。第二个表
    friends
    (主键
    friends1
    friends2
    ),其中一行
    f1
    f2
    ,如果“f1
    f2
    之间的友谊即将建立”,则存在,如果实际建立,
    accepted
    则为真,是表示多对多关系的正确方法


    (天真方法的唯一问题是,当您必须检查
    f1
    是否是
    f2
    的朋友时:这可能意味着行
    f1
    f2
    存在,或者行
    f2
    f1
    为+1,以克服此困难。)

    我不知道你指的是一个巨大的表,每个朋友都有一列,还是两个像下面这样的表,但后者最好

    [dbo].[Users]{
        User_ID int,
        UserName VarChar,
        Password ...
    }
    
    [dbo].[Friends]{
        User1_ID int,
        User2_ID int,
        Accepted bit
    }