做关联关联在数据库方面做任何事情

时间:2018-12-30 16:18:11

标签: javascript orm sequelize.js

在最近的项目中,我一直在使用sequelize,并且我对关联与迁移背后的情况感到好奇。例如,当我生成2个模型时:

user = {
  id,
  name,
}

post = {
  id,
  name,
}

然后生成一个迁移以添加关联的列:

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.addColumn(
      'posts',
      'userId', // name of the key we're adding
      {
        type: Sequelize.UUID,
        references: {
          model: 'users', // name of Target model
          key: 'id', // key in Target model that we're referencing
        },
        onUpdate: 'CASCADE',
        onDelete: 'SET NULL',
      }
    );
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.removeColumn(
      'posts', // name of Source model
      'userId' // key we want to remove
    );
  }
};

如果上述迁移将实际的associate列添加到posts表中,则模型中的userId方法会做什么?

模型中associate方法的示例:

module.exports = (sequelize, DataTypes) => {
  const post = sequelize.define('post', {
    name: DataTypes.TEXT
  }, {});
  post.associate = function(models) {
    post.belongsTo(models.user);
  };
  return post;
};
如果关联方法最终在db中创建实际的外键列,则

提出了一个更大的问题,这是创建外键列所必需的中间迁移(如上图所示,它创建了外键列) ?

2 个答案:

答案 0 :(得分:0)

尽管这不能完全详细回答这个问题,there's a decent description关于在关联文件夹下的续集github存储库中的关联

评论指出:

  

创建关联会将外键约束添加到属性

此外,以下内容暗示了实际上是从关联中生成列的事实:

 * To get full control over the foreign key column added by sequelize,
 * you can use the `foreignKey` option. It can either be a string, 
 * that specifies the name, or and object type definition,
 * equivalent to those passed to `sequelize.define`.
 *
 * ```js
 * User.hasMany(Picture, { foreignKey: 'uid' })
 * ```
 *
 * The foreign key column in Picture will now be called `uid` 
 * instead of the default `userId`.
 *
 * ```js
 * User.hasMany(Picture, {
 *   foreignKey: {
 *     name: 'uid',
 *     allowNull: false
 *   }
 * })
 * ```

答案 1 :(得分:0)

  

TL; DR:续集Associations在数据库方面不做任何事情,这意味着它们不能(创建表,添加列,添加约束,.. etc等)      

免责声明::我可能没有涵盖所有的好处/区别   都在这个答案中,这只是一个摘要。

1)这是我如何区分ModelMigration的方法  (基于功能):

  • 数据库上的Migration(创建表,添加约束,.. etc)
  • Model使您作为开发人员可以更轻松地与数据库上与Model(为之定义的模型)相对应的表进行交互,例如:A {{ 1}}模型可帮助您与 Users 表进行交互,而无需编写SQL查询。

2)User方法为您提供了两种特殊功能,它们分别是 lazyLoading eagerLoading,它们都使您省去了Associate的麻烦。
因此,再次“该模型使您免于自己编写原始SQL查询的麻烦。”