Mysql 如何在Sequelize中配置一对多关系?

Mysql 如何在Sequelize中配置一对多关系?,mysql,node.js,express,sequelize.js,Mysql,Node.js,Express,Sequelize.js,我目前正在使用带有Sequelize+MySQL的Express,我想知道解决这个问题的最佳方法是什么。如果这是一个基本问题,我很抱歉,因为我对续集甚至SQL数据库都是新手 我有一个这样的模型用户 export default db.define('User', { id: { type: Sequelize.INTEGER, allowNull: false, primaryKey: true, autoIncrement: true, }, nam

我目前正在使用带有Sequelize+MySQL的Express,我想知道解决这个问题的最佳方法是什么。如果这是一个基本问题,我很抱歉,因为我对续集甚至SQL数据库都是新手

我有一个这样的模型
用户

export default db.define('User', {
  id: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  email: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
});
export default db.define('Shoe', {
  id: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  size: {
    type: Sequelize.INTEGER,
    allowNull: true,
  },
  quality: {
    type: Sequelize.ENUM('Brand New', 'Used', 'Collector Item'),
    allowNull: false,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
});
然后我还有另一个型号的
像这样

export default db.define('User', {
  id: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  email: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
});
export default db.define('Shoe', {
  id: {
    type: Sequelize.INTEGER,
    allowNull: false,
    primaryKey: true,
    autoIncrement: true,
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  size: {
    type: Sequelize.INTEGER,
    allowNull: true,
  },
  quality: {
    type: Sequelize.ENUM('Brand New', 'Used', 'Collector Item'),
    allowNull: false,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
  },
});
然后我定义了这两者之间的关联

User.hasMany(Shoe);
Shoe.belongsTo(User);
然而,问题是它“创造”了鞋子,这导致了重复。我基本上想要一个名为“Shoes”的表,其中包含鞋子,然后用户根据它所拥有的鞋子引用ID

不确定这样做的最佳方式是什么,尤其是如果用户拥有多只鞋。在pseudo中,我想我需要一个类似shoe id的数组,比如
shoes:[1,2,3,4]
,当查询时,它会以某种方式在shoes表中查找并插入到用户响应中

显然,我可以在原始SQL中执行类似的操作,但鉴于Sequelize的强大功能,我认为一定有更好的方法来实现这一点

希望有人能就此提供一些建议和帮助

  • 我建议使用tableName选项
  • 如果您想要存储用户、鞋子以及关于每个用户拥有的鞋子的信息,则需要创建第三个表。这个n:m关联,因为每个用户可能有几个鞋,每个鞋可能属于几个用户。您可以通过以下几种方式创建此表:

    • 请参见Model.belongtomy和

    • 定义用户鞋模型,然后关联用户、鞋和用户鞋模型:

      export default db.define('UserShoe', {
        userId: {
          type: Sequelize.INTEGER,
          allowNull: false,
          primaryKey: true
        },
        shoeId: {
          type: Sequelize.INTEGER,
          allowNull: false,
          primaryKey: true
        }
      });
      
      
      User.belongsToMany(Shoe, {through: UserShoe});
      Shoe.belongsToMany(User, {through: UserShoe});
      
    • 或者像这样:

      User.hasMany(UserShoe);
      UserShoe.belongsTo(User);
      Shoe.hasMany(UserShoe);
      UserShoe.belongsTo(Shoe);
      
  • 我建议你读一本书SQL反模式/Karwin Bill。罗利和