掘金日新计划&Sequelize知识合集五

106 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天

一、引言

Sequelize 支持标准关联关系: 一对一, 一对多和多对多

为此,Sequelize 提供了 四种 关联类型,并将它们组合起来以创建关联:

  • HasOne 关联类型
  • BelongsTo 关联类型
  • HasMany 关联类型
  • BelongsToMany 关联类型

二、创建标准关系

  • 创建一个 一对一 关系, hasOne 和 belongsTo 关联一起使用;

  • 创建一个 一对多 关系, hasMany he belongsTo 关联一起使用;

  • 创建一个 多对多 关系, 两个 belongsToMany 调用一起使用.

2.1 一对一关系

假设我们有两个模型,Foo 和 Bar.我们要在 Foo 和 Bar 之间建立一对一的关系.我们知道在关系数据库中,这将通过在其中一个表中建立外键来完成.我们假设我们有两个模型,即 Foo 和 Bar. 我们想要在它们之间建立一对一的关系,以便 Bar 获得 fooId 列.

由于未传递任何参数,因此 Sequelize 将从模型名称中推断出要做什么. 在这种情况下,Sequelize 知道必须将 fooId 列添加到 Bar 中.

2.2 一对多关系

一对多关联将一个源与多个目标连接,而所有这些目标仅与此单个源连接.

这意味着,与我们必须选择放置外键的一对一关联不同,在一对多关联中只有一个选项. 例如,如果一个 Foo 有很多 Bar(因此每个 Bar 都属于一个 Foo),那么唯一明智的方式就是在 Bar 表中有一个 fooId 列. 而反过来是不可能的,因为一个 Foo 会有很多 Bar.

我们有模型 Team 和 Player. 我们要告诉 Sequelize,他们之间存在一对多的关系,这意味着一个 Team 有 Player ,而每个 Player 都属于一个 Team.

同样,实现此目标的主要方法是使用一对 Sequelize 关联(hasMany 和 belongsTo).

2.3 多对多关系

多对多关联将一个源与多个目标相连,而所有这些目标又可以与第一个目标之外的其他源相连.

不能像其他关系那样通过向其中一个表添加一个外键来表示这一点. 取而代之的是使用联结模型的概念. 这将是一个额外的模型(以及数据库中的额外表),它将具有两个外键列并跟踪关联.

我们将考虑模型 Movie 和 Actor. 一位 actor 可能参与了许多 movies,而一部 movie 中有许多 actors 参与了其制作. 跟踪关联的联结表将被称为 ActorMovies,其中将包含外键 movieId 和 actorId.

三、注意

不要忘记关联中引用的字段必须具有唯一性约束. 否则,将引发错误(对于 SQLite 有时还会发出诡异的 错误消息,例如 SequelizeDatabaseError: SQLITE_ERROR: foreign key mismatch - "ships" referencing "captains").

  • A.belongsTo(B) 将外键保留在源模型中(A),因此引用的键在目标模型中,因此使用了 targetKey.
  • A.hasOne(B) 和 A.hasMany(B) 将外键保留在目标模型(B)中,因此引用的键在源模型中,因此使用了 sourceKey.
  • A.belongsToMany(B) 包含一个额外的表(联结表),因此 sourceKey 和 targetKey 均可用,其中 sourceKey 对应于A(源)中的某个字段而 targetKey 对应于 B(目标)中的某个字段.

烟火向星辰,所愿皆成真!