Database design 当朋友也是用户时,如何表示朋友关系

Database design 当朋友也是用户时,如何表示朋友关系,database-design,Database Design,我正在用以下两个必备条件设计一个数据库: 用户可以有朋友 朋友是应用程序的用户 在我的概念设计中,我将其表示为: 我有几个问题: 1. 对吗? 2. 朋友是实体吗?我是否必须添加一个表Friend? 我想我需要一个有两列的表朋友,都是用户表的外键。您尝试设置的方案看起来非常像一个自引用多对多方案: 没有单独的Friend实体,只有一个名为UserFriend的“友谊链接”表。它有两个属性-表示朋友的用户实体的ID,以及表示朋友的用户的ID。“友谊”还可能包含其他属性,例如建立友谊的日期、

我正在用以下两个必备条件设计一个数据库:

  • 用户可以有朋友
  • 朋友是应用程序的用户
在我的概念设计中,我将其表示为:

我有几个问题:
1. 对吗?
2. 朋友是实体吗?我是否必须添加一个表
Friend


我想我需要一个有两列的表朋友,都是用户表的外键。

您尝试设置的方案看起来非常像一个自引用多对多方案:


没有单独的
Friend
实体,只有一个名为
UserFriend
的“友谊链接”表。它有两个属性-表示朋友的用户实体的
ID
,以及表示朋友的用户的
ID
。“友谊”还可能包含其他属性,例如建立友谊的日期、友谊存在的环境(大学、工作、家庭)等。

您尝试设置的方案看起来非常像一个自引用多对多方案:


没有单独的
Friend
实体,只有一个名为
UserFriend
的“友谊链接”表。它有两个属性-表示朋友的用户实体的
ID
,以及表示朋友的用户的
ID
。“友谊”还可能包含其他属性,例如建立友谊的日期、友谊存在的环境(大学、工作、家庭)等等。

我认为设计是正确的。但在friend表中,您应该只保留ID和与友谊相关的数据。表示用户\ id1和用户\ id2,其中用户\ id1和用户\ id2都是用户。两者都是朋友,我认为设计是正确的。但在friend表中,您应该只保留ID和与友谊相关的数据。表示用户\ id1和用户\ id2,其中用户\ id1和用户\ id2都是用户。两人都是朋友,谢谢你的回答。我会这样做的。现在,我考虑使用SQL语句在UserFriend表中查找我的所有好友:
SELECT*fromUserFriend,其中userId=myId或friendId=myId。而且,我正在考虑如何避免这样做:
插入到UserFriend值中(1,2)。一段时间后:
插入UserFriend值(2,1)。你怎么看?我想知道这个图表上的基数。从用户到用户朋友不是一对多的2关系吗?第一个关系是说用户有很多朋友,第二个关系是说用户是很多用户的朋友。@kpater87你说得对,我在底线上切换了
1
*
!谢谢@VansFannel也许你可以一开始就插入,或者像在Facebook上那样对待它:用户1说:“用户2是我的朋友”,而你可以
插入用户朋友值(1,2)但它需要确认,所以当用户2确认关系时,您将进行第二次插入:
插入UserFriend值(2,1)@VansFannel检索用户的所有好友
@MyUser
您可以
从UserFriend uf中选择u.*在u.Id=uf.FriendId上加入用户u,其中uf.UserId=@MyUser
。不幸的是,避免直接或间接的循环依赖关系取决于您的应用程序。谢谢您的回答。我会这样做的。现在,我考虑使用SQL语句在UserFriend表中查找我的所有好友:
SELECT*fromUserFriend,其中userId=myId或friendId=myId。而且,我正在考虑如何避免这样做:
插入到UserFriend值中(1,2)。一段时间后:
插入UserFriend值(2,1)。你怎么看?我想知道这个图表上的基数。从用户到用户朋友不是一对多的2关系吗?第一个关系是说用户有很多朋友,第二个关系是说用户是很多用户的朋友。@kpater87你说得对,我在底线上切换了
1
*
!谢谢@VansFannel也许你可以一开始就插入,或者像在Facebook上那样对待它:用户1说:“用户2是我的朋友”,而你可以
插入用户朋友值(1,2)但它需要确认,所以当用户2确认关系时,您将进行第二次插入:
插入UserFriend值(2,1)@VansFannel检索用户的所有好友
@MyUser
您可以
从UserFriend uf中选择u.*在u.Id=uf.FriendId上加入用户u,其中uf.UserId=@MyUser
。不幸的是,避免直接或间接的循环依赖关系取决于您的应用程序。