SQL友元函数

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 夸斯诺伊克服了这个困难。)

【讨论】:

以上是关于SQL友元函数的主要内容,如果未能解决你的问题,请参考以下文章

友元函数都有哪些特点?

友元函数友元类.

友元函数和友元类

友元函数

C++中,啥叫友元函数?啥叫友元类?请举例说明。

友元相关