делать сиквелизировать ассоциации делать что-либо на стороне БД - PullRequest
0 голосов
/ 30 декабря 2018

Я много использовал 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 в модели делает, если миграция выше добавляет фактический столбец userId в таблицу записей?

пример метода associate в модели:

module.exports = (sequelize, DataTypes) => {
  const post = sequelize.define('post', {
    name: DataTypes.TEXT
  }, {});
  post.associate = function(models) {
    post.belongsTo(models.user);
  };
  return post;
};

, который поднимает больший вопрос, если метод Associate заканчивает тем, что создает фактический столбец внешнего ключа в БД, является ли промежуточная миграция (подобная показанной выше, которая создает столбцы внешнего ключа) необходимой для создания столбца внешнего ключа?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

TL; DR: Sequelize Associations ничего не делает на стороне БД, что означает, что они не могут (создавать таблицы, добавлять столбцы, добавлять ограничения, .. и т. Д.)

Отказ от ответственности: Возможно, я не охватил все преимущества / различия обоих в этом ответе, это просто резюме.

1) вот как я различаюModel из Migration ( на основе функциональности ):

  • Migration (создает таблицы, добавлять ограничения, .. и т. д.) в DB
  • Model облегчает вам, как разработчику, взаимодействие с таблицей, соответствующей Model (для которой определена модель) в БД, например: модель User помогаетвзаимодействовать с таблицей Users без необходимости написания SQL-запросов.

2) Методы Associate дают вам две специальные возможности: lazyLoading и eagerLoading , которые оба избавят вас от головной боли при выполнении Joins.
так что да еще раз "The Model spaВы сами испытываете головную боль при написании необработанных SQL-запросов. "

0 голосов
/ 30 декабря 2018

Хотя это не полностью отвечает на вопрос в деталях, есть достойное описание об ассоциациях в репозитории github sequelize в папке ассоциаций

Комментарий гласит:

Создание ассоциации добавит ограничение внешнего ключа к атрибутам

, а также следующие подсказки о том, что столбец фактически генерируется из ассоциации:

 * 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
 *   }
 * })
 * ```
...