Sql 如何在关系数据库中为典型的朋友间关系建模?

Sql 如何在关系数据库中为典型的朋友间关系建模?,sql,data-modeling,Sql,Data Modeling,在关系数据库中建模朋友间关系的合适方法是什么?下面我将详细说明我所说的朋友之间的关系是什么意思 朋友间关系 假设我们有一张有人的桌子。这些人可以成为朋友。成为朋友意味着一个人和另一个人通过一种只包括这两个人的关系而联系在一起 到目前为止,我的最佳想法并不令人满意 有人的桌子 包含关系的表 包含人与人之间的多对多关系的表 关系 如下图所示 从数据建模的角度来看,这似乎很好,但当编写SQL查询来检查两个给定的person_ID是否是朋友时,查询变得相当复杂,这让我觉得这样做不合适。我建议使用一

在关系数据库中建模朋友间关系的合适方法是什么?下面我将详细说明我所说的朋友之间的关系是什么意思

朋友间关系

假设我们有一张有人的桌子。这些人可以成为朋友。成为朋友意味着一个人和另一个人通过一种只包括这两个人的关系而联系在一起

到目前为止,我的最佳想法并不令人满意

  • 有人的桌子
  • 包含关系的表
  • 包含人与人之间的多对多关系的表 关系
如下图所示


从数据建模的角度来看,这似乎很好,但当编写SQL查询来检查两个给定的person_ID是否是朋友时,查询变得相当复杂,这让我觉得这样做不合适。

我建议使用一个包含两个person\u id列的表,对于不同的关系可能使用relationshiptype id

我会选择[Friend-Friend-Relationship]链接表

[Friend]---[Link_table]---[Relationship]
                 |
              [Friend]
:) 编辑:

其中,例如[表]:列

  • [朋友]:朋友,姓名,姓氏
  • [链接]:主键链接,主键朋友1,主键朋友2,主键关系
  • [关系]:主键关系,关系描述
创建表格个人(
单个_id int主键,
全名varchar(255)
);
创建表关系(
从个人id int引用个人(个人id),
键入varchar(255)check(键入('FRIEND OF')),--应该是一个查找表
to_individual_id int引用个人(individual_id),
主键(从个人id到个人id,类型),
检查(从个人id到个人id)
);
我可以认为你是我的朋友,但你不认为我是你的朋友


但一般来说,“from”thinks“to”是朋友,反之亦然,因此您需要将反向关系添加为另一行

我将只使用两个表:persones和relationship。如果每个人都有一个ID,关系表将包含朋友的两个ID。如果您想要管理单向友谊(即,我跟随您,而您不跟随我),如果关系是双向的,您可以创建两行反向ID。这也将简化查询。当我说关系表将有两列,都包含person_id时,我是否正确地解释了它?假设是这样,我不喜欢这个解决方案的一点是,您需要检查人员是否在任一列中,因为进入每个列的人员是任意的。如果你概括并说你想对动态大小的关系建模,那么这个问题就变得更加清楚了,例如,你的团队或团队中包含了某些人,而不是朋友之间的关系。那么这个解决方案就行不通了。对吗?你能详细介绍一下link_表和relationship表中的列吗?尼尔,谢谢你为这个问题提供的信息丰富、具体的代码建议。虽然,这并不完全是我想要实现的,尽管可能是我在我的问题上不够具体。这两个人之间的关系不应该朝任何方向发展。他们要么是朋友,要么不是。
create table individuals (
  individual_id int primary key,
  full_name varchar(255)
);

create table relationships (
  from_individual_id int references individuals(individual_id),
  type varchar(255) check (type in ('FRIEND OF')), -- should be a lookup table
  to_individual_id int references individuals(individual_id),

  primary key (from_individual_id, to_individual_id, type),
  check (from_individual_id <> to_individual_id)
);