设计一个简单的关系数据库表来存储用户信息的朋友

时间:2015-05-22 12:11:03

标签: sql database database-design foreign-keys

我有一个简单的用户表说明了

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)? 或者任何人都可以提出更好的架构?

1 个答案:

答案 0 :(得分:1)

如果 user1 user2 的朋友,则 user2 user1 的朋友。

如果您没有像粉丝这样的额外角色,那么同时存储(1,2)和(2,1)都是多余的,在这种情况下,您只能存储上述对中的一对,并使用以下方式检索用户的朋友joinunion

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