【问题标题】:SQL friend functionSQL友元函数
【发布时间】:2009-01-23 22:21:26
【问题描述】:

构建朋友“功能”的最佳方式是什么。
这就是我的想法: 假设我有一个包含以下列的用户表:user_id、用户名、密码... 和一个朋友名字的表格,列有:friend1、friend2、accepted。

如果 user2 添加 user1,我希望 user2 显示在 user1 的个人资料中,而 user1 显示在 user2 的...:O

这似乎有点乱...有没有更聪明的方法?

【问题讨论】:

    标签: sql


    【解决方案1】:
    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 允许您使用索引并避免为唯一性进行额外排序。

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

    • 如果 ab 的朋友,那么 ba

    • 的朋友
    • a 永远不是 a

    • 的朋友

    【讨论】:

      【解决方案2】:

      我不知道你是指一个为每个朋友一列的大桌子,还是像下面这样的两张桌子,但后者是最好的。

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

      【讨论】:

        【解决方案3】:

        我认为你的设计很好。第二个表friends(主键friend1friend2),如果“即将建立f1f2之间的友谊”,则存在一行f1f2,并且@ 987654328@ 是 True 如果它实际上已经建立,是表示多对多关系的正确方式。

        (天真的方法的唯一问题是当您必须检查 f1f2 的朋友:这可能意味着行 f1, f2存在,f2f1 行是。+1 夸斯诺伊克服了这个困难。)

        【讨论】:

          猜你喜欢
          • 2018-08-11
          • 1970-01-01
          • 2018-11-14
          • 2014-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多