简介

边,是实体间的关系(或者是关联)。例如,用户的宠物,群组的用户(成员)。

er-group-users

在上面的例子中,你可以看到两个使用边声明的关系。让我们来实现他们。

1. pets / owner 边; 用户的宠物和宠物的主人:

ent/schema/user.go

ent/schema/pet.go

如你所见,一个 User 实体可以拥有 多个 Pet,但是一个 Pet 只能被 一个 User 拥有。 在关系定义时,pets 这条边是一个 02M(一对多)关系,owner 这条边是一个 M20(多对一)关系。

User 模式拥有 pets/owner 关系,因为它使用了 edge.To,而 Pet 模式只是通过 edge.FromRef 方法反向引用了 User.

因为从一个模式到另一个模式可以有多个引用,所以用 Ref 方法指明 Pet 想要引用 User 中的哪一条边,

可以使用 Unique 方法控制边(关系)的类型,下面会有更多的说明。

2. users / groups 边; 群组包含的用户和用户所属的群组。

ent/schema/group.go

ent/schema/user.go

如你所见,一个群组实体可以有 多个 用户,并且一个用户也可以属于 多个 群组。 在关系定义时,users 这条边是一个 M2M(多对多)关系,groups 这条件也是一个 M2M 的关系。

To 和 From

edge.Toedge.From 是两个用于创建边(关系)的构建器.

在一个关系中,使用 edge.To 定义边的模式,拥有该关系;而使用 edge.From 定义边的模式;只是反向引用了该关系。

继续看一些例子,这些例子示范了如何使用边定义不同的关系。

关系

两种类型的一对一关系

er-user-card

在这个例子中,一个用户只有 一张 信用卡,一张信用卡只能有 一个 户主。

User 模式中使用 edge.To 为信用卡定义一条名为 card 的边。并在 Card 模式中使用 edge.From 为用户定义一条名为 owner 的逆边。

ent/schema/user.go

ent/schema/card.go

下面是一些与边交互的 API:

完整的例子请查看 GitHub.

同类型的一对一关系

er-linked-list

在这个链表例子中,我们有一个名为 next/prev 的递归关系。链表中的每个节点都只有 一个 nextprev 节点。 如果,节点 A 可以通过 next 指向 节点 B,则节点 B 也可以通过 prev(反向引用) 指向节点 A。

ent/schema/node.go

如你所见,在同类型关系的情况下,可以在一个构建器内声明边及其引用。

下面是一些与边交互的 API:

完整的例子请查看 GitHub.

双向的一对一关系

er-user-spouse

在这个用户-配偶例子中,我们有一个名为 spouse对称一对一 关系。每个用户只能有 一个配偶。 如果用户 A 的配偶是(使用 spouse 关系) 是 B,那么也可以得知 B 的配偶(使用 spouse 关系)。

注意,在双向关系中,不存在拥有/属于这种说法。

ent/schema/user.go

下面是一些与边交互的 API:

完整的例子请查看 GitHub.

不同类型的一对多关系

er-user-pets

在这个 用户-宠物 的例子中,用户和宠物之间存在一个 O2M (一对多)关系。 每个用户可以有 多个 宠物,但是一个宠物只有 一个 主人(用户)。如果用户 A 通过 pets 边添加了一个宠物 B,那么,宠物 B 可以通过 owner 边(反向引用边)找到他的主人。

注意,从 Pet (宠物)的角度来说,这就是多对一的关系(M20,many-to-one)。

ent/schema/user.go

ent/schema/pet.go

下面是一些与边交互的 API:

完整的例子请查看 GitHub.

同类型的一对多关系

er-tree

In this example, we have a recursive O2M relation between tree's nodes and their children (or their parent). Each node in the tree has many children, and has one parent. If node A adds B to its children, B can get its owner using the owner edge. 这个例子中,在树的节点及其子节点(或父节点)之间存在一对多(O2M)关系的关系。 树中的每个节点有 多个 子节点,但是它只有 一个 父节点。 如果节点 A 有一个子节点 B,那么节点 B 可以通过 owner 边找到节点 A。

ent/schema/node.go

如你所见,在同类型关系的情况下,可以在一个构建器内声明边及其引用。

下面是一些与边交互的 API:

完整的例子请查看 GitHub.

不同类型的多对多关系

er-user-groups

在这个例子中,在群组和用户之间存在一个多对多(M2M)的关系。 每个群主可以有 多个 用户,每个用户也可以加入 多个 群组。

ent/schema/group.go

ent/schema/user.go

下面是一些与边交互的 API:

完整的例子请查看 GitHub.

同类型的多对多关系

er-following-followers

下面这个 关注-粉丝 的例子,在用户及其粉丝之间存在一个多对多(M2M)的关系。 每个用户可以关注 多个 用户,也可以有 多个 粉丝。

ent/schema/user.go

如你所见,在同类型关系的情况下,可以在一个构建器内声明边及其引用。

下面是一些与边交互的 API:

完整的例子请查看 GitHub.

双向的多对多关系

er-user-friends

In this user-friends example, we have a symmetric M2M relation named friends. Each user can have many friends. If user A becomes a friend of B, B is also a friend of A. 在这个 用户-朋友 的例子中,存在一个名为 freiends 的双向多对多关系。 每个用户可以有 多个 朋友。如果用户 A 是用户 B 的朋友,那么用户 B 也肯定是用户 A 的朋友。

注意,在双向关系中,不存在拥有/属于这种说法。

ent/schema/user.go

下面是一些与边交互的 API:

完整的例子请查看 GitHub.

必选项

Edges can be defined as required in the entity creation using the Required method on the builder. 可以使用构建器中的 Required 方法定义关系,使得实体创建时必须满足该关系。

比如说,无法创建一张没有户主的信用卡。

索引

可以在多个字段或者某些边上添加索引。但是,需要注意的是,目前只有 SQL 支持索引特性。

更多关于索引的内容,可以查阅 索引 部分。

Last updated

Was this helpful?