Имя внешнего ключа MySQL, что это такое?

#mysql #sequelize.js

#mysql #sequelize.js

Вопрос:

Я использую Sequelize, nodejs ORM для mysql. Используя mysql workbench, я создал диаграмму EEM и перенес этот дизайн в БД, пока все хорошо.

Теперь в Sequelize я должен рассказать, как выглядит дизайн БД, частично это говорит о том, как называются внешние ключи.

В Workbench есть foreign key вкладка в таблице there are variables formatted like fd_positions_tradingPLan1`, но я никогда не называю это, на самом деле на моей диаграмме EEM у меня есть

введите описание изображения здесь

Затем, если я перейду на эту foreign keys вкладку внизу, я получу это. Я в замешательстве относительно того, что именно я должен сообщить ORM о внешнем ключе…

введите описание изображения здесь

Комментарии:

1. если вы не назовете FK при их создании, движок автоматически сгенерирует для вас имя — это имя, которое вы видите

2. Значит, это те столбцы в БД? Когда я открываю таблицу, я их не вижу. Я перетащил отношения с диаграммой EEM, так что, возможно, они были введены. Тем не менее, я удалил некоторые FK, потому что в некоторых случаях они добавляли по 4 FK на таблицу, когда мне действительно нужен был только один.

3. fd_positions_tradingPLan1 и fk_positions_users1 ваши ключи fk. Они не являются столбцами. Имена на вашей первой фотографии — это столбцы

4. О, значит, FK не отображаются в столбцах?

Ответ №1:

Давайте возьмем вашу positions таблицу в качестве ссылки. Чтобы построить свою модель на sequelize, вам нужно выполнить следующее:

 module.exports = (sequelize, DataTypes) => {
  const Position = sequelize.define('Position', { // this is the name that you'll use on sequelize methods, not what you have on your db
    // define your columns like this:
    tradeName: { //the name of the variable that you'll use on sequelize and js
      field: 'trade_name', //the actual name of your column on the table
      type: DataTypes.STRING(128) // the data type
    },
    // .......
    // for your foreignKeys you have to define the column like your other attributes.
    userId: {
      field: 'user_id',
      type: DataTypes.INTEGER
    },
  }, {
    tableName: 'positions', //this is the name of your table on the database
    underscored: true, // to recognize the underscore names
    createdAt: 'created_at', //
    updatedAt: 'updated_at',
  });

  //now for your association let's say that you defined your USER table like this example.
  Position.associate = (models) => {
    // on the foreignKey value, youhave to put the same that you define above, and on the db.
    Position.belongsTo(models.User, { as: 'User', foreignKey: 'user_id' });
    //depending on your other relations, you are gonna use hasMany, hasOne, belongsToMany
  };

  return Position;
};
  

Sequelize выполняет ассоциацию только одним способом, это означает, что в этом примере вы не можете запрашивать с помощью sequelize from User to Position , чтобы
иметь двустороннюю ассоциацию, которую вы должны определить для обеих моделей.

 User.associate = (models) => {
  // on this case we use hasMany cause user can have many positions I suppose, if not, use hasOne
  User.hasMany(models.Poisition, { as: 'positions', foreignKey: 'user_id' }); //remeber to use the same foreignKey name
};
  

Обновить:

as является идентификатором для продолжения. Допустим, вы создаете две ассоциации для одной и той же модели, позже, когда вы попытаетесь запросить одну из этих ассоциаций, вы можете указать нужную ассоциацию

 User.associate = (models) => {
  User.hasMany(models.Poisition, { as: 'positions', foreignKey: 'user_id' }); 
  User.hasMany(models.Poisition, { as: 'customerPositions', foreignKey: 'customer_id' }); 
};

//the actual association call
User.findAll({ 
  include:[{
    model: db.user,
    as: 'positions'
  }, {
    model: db.user,
    as: 'customerPositions'
  }]
})
  

Теперь для fk_positions_users1 , это идентификатор для самого MySQL. Sequelize проверяет только внешний ключ и модели, связанные с ним. Очевидно, что когда Sequelize создает ссылку, она дает имя шаблона, используя имя таблицы и столбца. Я попробовал сам создать новый внешний ключ в своей таблице, а затем обновить модель, и все идет нормально. У вас не должно возникнуть проблем с этим.

Комментарии:

1. Хорошо, я видел подобные примеры, что {as: 'positions'... делать? Тогда ...foreignKey: 'user_id' как это получить мои fk fk_positions_users1 из моего сообщения в Positions