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允许您使用索引并避免为唯一性进行额外排序
所有这些对于作为对称和反自反关系的“友谊”都是有效的。这意味着:
- 如果a是b的朋友,那么 b是a
- 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
}