如何在关系数据库中对典型的朋友间关系进行建模?



在关系数据库中对朋友关系进行建模的适当方法是什么?我将在下面详细说明我所说的朋友与朋友的关系是什么意思。

朋友与朋友的关系

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

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

  • 包含人员的表
  • 包含关系的表
  • 包含人与 关系

如下图所示。

建议的数据模型

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

我会推荐一个包含两个person_id列的表,也许还有一个用于不同关系的关系类型ID

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)
);

我可以认为你是我的朋友,但你不认为我是你的朋友......

但通常"from"认为"to"是朋友,反之亦然,所以你会将反向关系添加为另一行

我会选择[朋友 - 朋友 - 关系]链接表。

[Friend]---[Link_table]---[Relationship]
|
[Friend]

:)编辑:

其中例如 [表]:列...

  • [朋友]:PK_Friend、姓名、姓氏
  • [链接]: PK_Link, PK_Friend1, PK_Friend2, PK_RelationShip
  • [关系船]: PK_RelationShip, 关系船描述

最新更新