设计一个简单的关系型数据库table 存储用户好友信息
Design a simple relational database table to store friends of user information
我有一个简单的用户 table say with columns
user_id PK
Name
还有一个朋友 table 有专栏
user_id FK
friend_id FK
现在说朋友table店
Table Friends
---------------
user_id friend_id
----------------
1 2
1 3
2 3
好友关系为<->
现在要检索用户 1 的朋友列表,我可以这样做
SELECT friend_id FROM friends where user_id = 1;
但是由于它是双向关系,我如何检索用户 3 的朋友列表,即使它在 user_id 朋友 table 列中的任何地方都没有通过查询提及用户 3 ?我是否必须在朋友 table 中进行冗余存储,如 (3,1)、(3,2)?
或者谁能提出更好的方案?
如果 user1 是 user2 的朋友,那么 user2 是 [=] 的朋友17=]用户 1.
如果您没有像关注者这样的额外角色,那么在这种情况下同时存储 (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
我有一个简单的用户 table say with columns
user_id PK
Name
还有一个朋友 table 有专栏
user_id FK
friend_id FK
现在说朋友table店
Table Friends
---------------
user_id friend_id
----------------
1 2
1 3
2 3
好友关系为<-> 现在要检索用户 1 的朋友列表,我可以这样做
SELECT friend_id FROM friends where user_id = 1;
但是由于它是双向关系,我如何检索用户 3 的朋友列表,即使它在 user_id 朋友 table 列中的任何地方都没有通过查询提及用户 3 ?我是否必须在朋友 table 中进行冗余存储,如 (3,1)、(3,2)? 或者谁能提出更好的方案?
如果 user1 是 user2 的朋友,那么 user2 是 [=] 的朋友17=]用户 1.
如果您没有像关注者这样的额外角色,那么在这种情况下同时存储 (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