Sequelize.js 对外键目标与源进行续集

Sequelize.js 对外键目标与源进行续集,sequelize.js,Sequelize.js,我使用sequelize已经有一段时间了,但从未真正了解过foreignKey的实际工作原理。他们在文件中声明: 目标键是源模型上的外键列指向的目标模型上的列 那么在以下情况下,目标是谁 Route.belongsTo(models.Subarea, { foreignKey: 'subareaId', as: 'subarea', }); Route.belongsToMany(models.Book, { through: mod

我使用sequelize已经有一段时间了,但从未真正了解过
foreignKey
的实际工作原理。他们在文件中声明:

目标键是源模型上的外键列指向的目标模型上的列

那么在以下情况下,目标是谁

    Route.belongsTo(models.Subarea, {
      foreignKey: 'subareaId',
      as: 'subarea',
    });

    Route.belongsToMany(models.Book, {
      through: models.BookRoute,
      foreignKey: 'routeId',
      as: 'books',
    });

我的困惑在于,为什么在第一种情况下,我把foreignKey放在subreaid上,而在第二种情况下,我把它放在routeId上。如果两种情况下都不是routeId,那么foreignKey应该是sourceId吗?

我建议按以下步骤进行推理:

  • 确定源和目标模型。这只是约定:源是调用方法的模型,所以基本上是符号中“左边的那个”。目标是另一个模型,所以“右边的那个”
  • 了解各种方法将外键放在何处:
    hasOne
    hasMany
    将fk放在目标位置
    belongsTo
    将fk置于源代码上
    BelongToMany
    通过模型将fk置于
  • 理解外键(顾名思义)将引用“另一个模型”(因此不是2下的模型)。因此,对于
    hasOne
    hasMany
    将参考源模型;对于
    以下内容,请参考目标模型;对于
    belongstomy
    源模型的引用(您可以使用
    otherKey:
    引用目标模型)
    belongtomany
    是一种特殊情况,因为引入了第三种模型:直通模型(或联接表),在该模型上存储源和目标的外键。这在某种程度上改变了外键的“透视图”,因此,在外键引用方面,您无法将其与
    belongsTo
    进行完全比较

    因此,回答您的问题:

    • 目标是哪一个?分别是分区和书本
    • 使用哪个外键?:您的外键与上面的一致 解释
      BelongToMany
      作为外键是例外的 既不存储在源上也不存储在目标上,而是存储在直通模型上