【问题标题】:Postresql, Node.js ORM - foreignKey and primaryKey issue in relation table (Many to Many)Postgresql,Node.js ORM - 相关表中的外键和主键问题(多对多)
【发布时间】:2020-03-02 23:15:33
【问题描述】:

我只是在多对多关系中创建 CompanyIndustry 表。 一个公司可以包含多个行业,一个行业可以包含多个国家。 在 UI 中,例如公司的多选框,我可以在其中选择多个行业。

我在模型中所做的事情:

Industry.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Industry = sequelize.define('Industry', {
    industry_name: DataTypes.STRING,
  }, {
    timestamps: false,
    underscored: true,
    tableName: 'industry',
  });
  Industry.associate = function(models) {
    Industry.belongsToMany(models.Company, {
      through: 'company_industry_relation', foreignkey: 'industry_id'
    });
  };
  return Industry;
};

公司.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Company = sequelize.define('Company', {
    company_name: DataTypes.STRING,
  }, {
    timestamps: false,
    underscored: true,
    tableName: 'company',
  });
  Company.associate = function(models) {
    Company.belongsToMany(models.Industry, {
      through: 'company_industry_relation', foreignKey: 'company_id'
    });
  };
  return Company;
};

CompanyIndustryRelation.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  const CompanyIndustryRelation = sequelize.define('CompanyIndustryRelation', {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
    },
  }, {
    timestamps: false,
    underscored: true,
    tableName: 'company_industry_relation',
  });
  CompanyIndustryRelation.associate = function(models) {
    CompanyIndustryRelation.belongsTo(models.Company, { foreignKey: 'company_id' });
    CompanyIndustryRelation.belongsTo(models.Industry, { foreignKey: 'industry_id' });
  };
  return CompanyIndustryRelation;
};

但我在这里关心的是这些模型在company_industry_relation 表中创建 company_id(PK) 和 industry_id(PK)。 id(PK) 也没有在表中创建。 在我看来,这两列(company_id 和 Industry_id)应该是外键,而 id(PK) 的创建应该与这两列不同?

有人对此有什么想法吗? 提前致谢!

【问题讨论】:

    标签: node.js postgresql orm sequelize.js


    【解决方案1】:

    您不需要关系表中的关联...只需删除它们...设置 belongsToMany 的任一侧就足够了...

    你在关系表中的主键是复合主键……也就是说一个公司可以属于很多行业,一个行业可能有很多公司但是你永远不能复制复合主键……

    company_id         industry_id
    1                  1
    1                  2
    2                  2
    2                  3
    

    这些都是你的连接表中的有效记录,它们的组合构成了记录的主键......所以很明显,一旦使用了 1,1,那么你不能也不想添加它再次输入东西...如果您在该主键中包含一个实际的 id 字段,那么您或其他在您的代码中工作的人可能会不小心再次添加相同的关系

    【讨论】:

    • 感谢您的回复,格雷格!实际上,起初,我曾经尝试过不使用关系模型定义。但它和现在一样。我认为定义关系模型或不定义关系模型没什么大不了的。
    • 已删除并执行,但关系表中的这两列(company_id、undustry_id)仍为PK。我确定那些应该是foreginKey,为什么要在关系表中创建两个primarKeys?正常吗?
    • 是的,它是一个复合主键...没关系...您甚至不需要该表上的 id 字段,因为仅这两个字段就足够了...您永远不会能够以这两个字段作为主键复制一个条目,但从技术上讲,如果您涉及所有三个字段,您可能会意外......我个人会一起删除 id 字段
    • 我无法想象拥有 id 字段对您来说是一个加分项的场景,因为您不会在其中存储任何其他想要管理的数据
    • 感谢更新,格雷格。我按照您上面的建议更新了代码,但与 PK 相同,关系表中的 id 也没有被创建。 :(
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-07-11
    • 2020-01-08
    • 2023-04-03
    • 1970-01-01
    • 2011-07-17
    • 2022-01-21
    相关资源
    最近更新 更多