【发布时间】:2011-02-24 00:08:11
【问题描述】:
我正在创建一个涉及可以成为朋友的用户的数据库模式,我想知道为这些用户建立友谊的能力建模的最佳方法是什么。它应该是它自己的表,它只有两列,每列代表一个用户吗?谢谢!
【问题讨论】:
标签: mysql database database-design
我正在创建一个涉及可以成为朋友的用户的数据库模式,我想知道为这些用户建立友谊的能力建模的最佳方法是什么。它应该是它自己的表,它只有两列,每列代表一个用户吗?谢谢!
【问题讨论】:
标签: mysql database database-design
是的(使用 n:m 链接表)。
你有两个实体:
每人创建一张表。
【讨论】:
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)
);
当用户1向用户2发送好友请求时,做
insert into friendship (user, friend) values (1,2);
如果用户 2 拒绝请求,
delete from friendship where user = 1 and friend = 2;
如果用户 2 接受:
insert into friendship (user, friend) values (2,1);
那么,这样就可以找到友谊了:
select f1.*
from friendship f1
inner join friendship f2 on f1.user = f2.friend and f1.friend = f2.user;
你可以用最后一个查询来做一个视图,它会帮助你查询用户的朋友,甚至是朋友的朋友。
【讨论】:
user、friend 和 status 列用于友谊(其中状态可能意味着待处理、接受、拒绝或删除),查询待处理请求会容易得多(您需要两行左连接)。但是,查询用户的朋友会比较困难:select case when user=@userId then friend else user end as friendId from friendship where (user=@userId or friend=@userId) and status = 1;
我不确定,这是我想要为整个设置建模的方式。当用户 A 向用户 B 发送请求时,我认为会创建 pending_friendship。 当用户 B 接受这个请求时,两人之间的友谊就建立了。通常这将是一种双向关系,并且会很棒。但我想确保将来存在单向关系的空间。因此,我将通过使用两个表作为关系表和一个表作为用户自己来模拟场景。
用户( 用户身份, 电子邮件, 密码哈希, 姓名, ..., ... )
待定_友谊( user_id_from, user_id_to )
友谊( 友谊ID, current_user_id, 朋友用户ID, is_following boolean # 这将确保单向关系的范围。 )
现在让我们看看用例-
1- 用户 A 向用户 B 发送请求- 我将在 pending_friendship 表中创建一个条目。
当用户 B 想查看哪些好友请求未决时,我们可以根据friend_request_to 列进行选择查询。
2- 用户 B 接受好友请求-pending_friendship 项目从表中删除。在双边关系的友谊表中创建了两个条目。两个用户都会互相关注。
3- 用户 B 是好友,不想关注用户 A 的动态- 用户 B 与用户 A 的好友行的 is_following 列设置为 false。
4- 用户 A 不想再和 B 做朋友了-(毕竟在案例 3 中 B 已经取消关注他 :-))我们继续删除两行以表示用户之间的友谊两个用户。
此架构确实更复杂,但更清晰。它还允许您具有关注用户的关系。
【讨论】: