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 允许您使用索引并避免为唯一性进行额外排序。
以上所有对于作为对称和反自反关系的“友谊”都是有效的。这意味着:
如果 a 是 b 的朋友,那么 b 是 a
的朋友a 永远不是 a
的朋友【讨论】:
【参考方案2】:我不知道你是指一个为每个朋友一列的大桌子,还是像下面这样的两张桌子,但后者是最好的。
[dbo].[Users]
User_ID int,
UserName VarChar,
Password ...
[dbo].[Friends]
User1_ID int,
User2_ID int,
Accepted bit
【讨论】:
【参考方案3】:我认为你的设计很好。第二个表friends
(主键friend1
,friend2
),如果“即将建立f1
和f2
之间的友谊”,则存在一行f1
,f2
,并且@ 987654328@ 是 True 如果它实际上已经建立,是表示多对多关系的正确方式。
(天真的方法的唯一问题是当您必须检查 f1
是 f2
的朋友:这可能意味着行 f1
, f2
存在,或f2
,f1
行是。+1 夸斯诺伊克服了这个困难。)
【讨论】:
以上是关于SQL友元函数的主要内容,如果未能解决你的问题,请参考以下文章