【问题标题】:How to configure a one to many relationship in Sequelize?如何在 Sequelize 中配置一对多关系?
【发布时间】:2026-01-18 15:45:01
【问题描述】:

我目前正在使用 Express 和 Sequelize + MySQL,我想知道解决这个问题的最佳方法是什么。如果这是一个基本问题,我深表歉意,因为我对 Sequelize 甚至 SQL 数据库都很陌生。

我有一个模特User 像这样;

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,
  },
});

那我还有另一个模特Shoe 像这样;

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。

不确定执行此操作的最佳方法是什么,尤其是在用户拥有多双鞋的情况下。在伪中,我想我想要一个像 shoes: [1, 2, 3, 4] 这样的鞋 id 数组,当被查询时,它会以某种方式在鞋表中查找并插入到用户响应中。

显然我可以在原始 SQL 中执行类似的操作,但鉴于 Sequelize 的强大功能,我认为必须有更好的方法来解决此问题。

希望有人可以就此提供一些建议和帮助!

【问题讨论】:

    标签: mysql node.js express sequelize.js


    【解决方案1】:
    1. 我建议使用 tableName 选项。
    2. 如果您想要存储用户、鞋子以及每个用户拥有的鞋子的信息,您需要创建第三个表。这种 n:m 关联,因为每个用户可能有几只鞋子,而每只鞋子可能属于几个用户。您可以通过多种方式创建此表:

      • 参见 Model.belongsToMany tutorialapi doc

        User.belongsToMany(Shoe, {through: 'UserShoe'});
        Shoe.belongsToMany(User, {through: 'UserShoe'});
        
      • 定义 UserShoe 模型,然后关联 User、Shoe 和 UserShoe 模型:

        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);
        
    3. 我建议您阅读一本书 SQL 反模式/Karwin Bill。罗利和Sequelize association docs

    【讨论】: