构建朋友“功能”的最佳方法是什么。
这就是我的想法:
让我说我有一个usertable与以下列:user_id,用户名,密码...
以及包含列的朋友名称的表格:friend1,friend2,accepted。
如果user2添加了user1,我希望user2显示在user1的配置文件中,user1显示在user2的...:O
这看起来有点混乱......有更聪明的方法吗?
答案 0 :(得分:4)
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
答案 1 :(得分:1)
我认为你的设计很好。第二个表friends
(主键friend1
,friend2
),如果f1
和f2
之间存在友谊,则会出现行f1
,f2
accepted
即将建立“,f1
如果实际已经建立则为真,是表示多对多关系的正确方式。
(天真方法的唯一问题是当你必须检查 f2
是f1
的朋友时:这可能意味着行{{1 }},f2
存在,或行f2
,f1
为Quassnoi的+1。克服此困难。)
答案 2 :(得分:1)
我不知道你的意思是一个庞大的桌子,每个朋友有一个列,或者下面有两个表,但后者是最好的。
[dbo].[Users]{
User_ID int,
UserName VarChar,
Password ...
}
[dbo].[Friends]{
User1_ID int,
User2_ID int,
Accepted bit
}