为什么 Sequelize 迁移创建的表只有 1 个前键而不是 2 个?

问题描述 投票:0回答:1

我正在尝试在两个模型之间创建一个中间表,称为“用户”和“提醒”。 事实上,每次我尝试迁移或创建表 UserReminders 时,我都不会获得 2 个前键,userId 和 RememberId,而是只获得一个前键,即 RememberId。

这是我在 heidiSQL 上的表上显示的内容

我在后端创建了一个名为 UserReminder 的模型,并将其迁移到 HeidiSQL 上的数据库。

型号:

import { Model } from 'sequelize'

const loadModel = (sequelize, DataTypes) => {
  class UserReminder extends Model {
    static associate (models) {
      // Un UserReminder pertenece a un usuario
      UserReminder.belongsTo(models.User, { foreignKey: 'userId', onDelete: 'CASCADE' })
      // Un UserReminder pertenece a un recordatorio
      UserReminder.belongsTo(models.Reminder, { foreignKey: 'reminderId', onDelete: 'CASCADE' })
    }
  }

  UserReminder.init({
    userId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Users',
        key: 'id'
      },
      onDelete: 'CASCADE',
      onUpdate: 'CASCADE'
    },
    reminderId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: {
        model: 'Reminders',
        key: 'id'
      },
      onDelete: 'CASCADE',
      onUpdate: 'CASCADE'
    },
    createdAt: {
      allowNull: false,
      type: DataTypes.DATE,
      defaultValue: DataTypes.NOW
    },
    updatedAt: {
      allowNull: false,
      type: DataTypes.DATE,
      defaultValue: DataTypes.NOW
    }
  }, {
    sequelize,
    modelName: 'UserReminder',
    tableName: 'UserReminders',
    timestamps: true,
    indexes: [
      {
        unique: true,
        fields: ['userId', 'reminderId']
      }
    ]
  })

  return UserReminder
}

export default loadModel

迁移:

'use strict'
/** @type {import('sequelize-cli').Migration} */
module.exports = {
  async up (queryInterface, Sequelize) {
    await queryInterface.createTable('UserReminders', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      userId: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {
          model: 'Users',
          key: 'id'
        },
        onDelete: 'CASCADE'
      },
      reminderId: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {
          model: 'Reminders',
          key: 'id'
        },
        onDelete: 'CASCADE'
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('now')
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('now')
      }
    })

    await queryInterface.addConstraint('UserReminders', {
      fields: ['userId', 'reminderId'],
      type: 'unique',
      name: 'unique_user_reminder'
    })
  },

  async down (queryInterface, Sequelize) {
    await queryInterface.dropTable('UserReminders')
  }
}

我期望有 1 个名为 id 的主键,2 个外键 userId 和提醒 ID,以及 1 个唯一的复合键(userId,reminderId)。但我得到了我所说的东西,但只有一个前键(reminderId)而不是 2 个。

javascript foreign-keys migration sequelize-cli heidisql
1个回答
0
投票

遭遇我的问题

En una base de datos, un índice y una clave foránea son Conceptos relacionados pero distintos:

Clave foránea:Es una retricción que asegura que el valor de una columna or conjunto de Columnas con los valores de una columna or conjunto de columnas en otra tabla, lo que garantiza la integridad Referencial. SQL 中外键的定义受到限制。

Índice:这是巴斯克达操作速度的最佳结构。 Aunque una clave foránea puede implicar la Creación de un índice, no siempre se crea explícitamente un índice separado, especialmente si la columna que forma parte de la clave foránea es tambiénparte de una clave primaria or un índice compuesto.

¿为什么没有用户 ID 的分隔符? 在这种情况下,userId 是由 userId 和提醒 ID 组成的。 Al definir una clave única, la base de datos automáticamente create un índice único que cubre ambas columns.这意味着没有必要在单独的用户 ID 上添加附加说明,您可以在其中添加该说明。

Sin 禁运,我们可以为咨询者提供额外的优化建议。创建明确的提醒信息我建议您经常单独使用提醒信息,以便确定优化建议。

将用户 ID 分开 如果您需要对用户 ID 进行单独的测试(请在咨询中进行查询),并在迁移过程中进行详细说明。 Aquí está como podrías modificar la sección de la migración para incluir este índice:

迁移

// Crear índice para userId (opcional) await queryInterface.addIndex('UserReminders', ['userId'])

简历 为用户提供明确的说明,这是您在计算中的一部分,您可以创建一个包含此专栏的说明。 如果需要对用户 ID 进行附加说明,请在迁移过程中进行详细说明。 解决方案可能会造成混淆,并保证您的基础架构能够对必要的数据进行优化。

© www.soinside.com 2019 - 2024. All rights reserved.