友谊数据库架构

Dan*_*nny 23 mysql database database-design

我正在创建一个涉及可以成为朋友的用户的数据库模式,我想知道为这些朋友建立友谊的最佳方式.它应该是自己的表,只有两列,每列代表一个用户?谢谢!

cet*_*ras 49

create table 
friendship(
user bigint, 
friend bigint,
primary key(user, friend),
key(friend, user),
constraint `fk_user` foreign key (user) references user(id),
constraint `fk_friend` foreign key (friend) references user(id)
);
Run Code Online (Sandbox Code Playgroud)

当用户1向用户2发送友谊请求时,请执行

insert into friendship (user, friend) values (1,2);
Run Code Online (Sandbox Code Playgroud)

如果用户2拒绝该请求,

delete from friendship where user = 1 and friend = 2;
Run Code Online (Sandbox Code Playgroud)

如果用户2接受它:

insert into friendship (user, friend) values (2,1);
Run Code Online (Sandbox Code Playgroud)

然后,友谊可以这样找到:

select f1.* 
from friendship f1
inner join friendship f2 on f1.user = f2.friend and f1.friend = f2.user;
Run Code Online (Sandbox Code Playgroud)

您可以使用此最后一个查询创建一个视图,它将帮助您查询用户的朋友,甚至是朋友的朋友.

  • 好问题.我在遗留应用程序中使用上述结构,但如果我要实现一个,我会尝试使用一行结构.如果你有友谊的'user`,`friend`和`status`列(状态可能意味着挂起,接受,拒绝或删除),查询待处理请求会更容易(需要两行)左连接).但是,查询用户的朋友会更加困难:`用户= @ userId时选择大小写,然后用友情用户结束朋友,例如来自友情的朋友,用户= @ userId或朋友= @ userId),状态= 1; (11认同)
  • +1这个直接而详细的答案.但是,我尝试平衡一行的优缺点,每个友谊两行.你能解释为什么两行在你看来更好吗? (2认同)