我有一个简单的用户表说明了
user_id PK
Name
带有列的朋友表
user_id FK
friend_id FK
现在说朋友桌店
Table Friends
---------------
user_id friend_id
----------------
1 2
1 3
2 3
朋友的关系是< - > 现在要检索用户1的朋友列表,我可以
SELECT friend_id FROM friends where user_id = 1;
但由于它是一种双向关系,即使它没有在带有查询的朋友表的user_id列中的任何地方提及用户3,我如何检索用户3的朋友列表呢?我是否必须在朋友表中执行冗余存储,如(3,1),(3,2)? 或者任何人都可以提出更好的架构?
答案 0 :(得分:1)
如果 user1 是 user2 的朋友,则 user2 是 user1 的朋友。
如果您没有像粉丝这样的额外角色,那么同时存储(1,2)和(2,1)都是多余的,在这种情况下,您只能存储上述对中的一对,并使用以下方式检索用户的朋友join
和union
:
select u.user_id user, f1.friend_id friend
from users u
join friends f1 on u.user_id=f1.user_id
union
select u.user_id user, f2.user_id friend
from users u
join friends f2 on u.user_id=f2.friend_id