首页 > 解决方案 > 保存 Sequelize 记录/在另一个模型中引用它

问题描述

我有一个名为 的 postrgresql/Sequelize 模型Segment,它属于许多模型:

module.exports = (sequelize, DataTypes) => {
  const Segment = sequelize.define(
    'segment',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      provider_id: {
        type: DataTypes.INTEGER,
        references: {
          model: 'provider',
          key: 'id'
        }
      },
      summary_id: {
        type: DataTypes.INTEGER,
        references: {
          model: 'summary',
          key: 'id'
        }
      },
      audience_id: {
        type: DataTypes.INTEGER,
        references: {
          model: 'audience',
          key: 'id'
        }
      },
      onboarding_id: {
        type: DataTypes.INTEGER,
        references: {
          model: 'onboarding',
          key: 'id'
        }
      }
    },
    {
      // disable the modification of table names; By default, sequelize will automatically
      // transform all passed model names (first parameter of define) into plural.
      // if you don't want that, set the following
      freezeTableName: true,
      tableName: 'segment'
    }
  );
  Segment.associate = models => {
    Segment.belongsTo(models.Provider, { foreignKey: 'id' });
    Segment.belongsTo(models.Summary, { foreignKey: 'id' });
    Segment.belongsTo(models.Audience, { foreignKey: 'id' });
    Segment.belongsTo(models.Onboarding, { foreignKey: 'id' });
  };
  return Segment;
};

细分与(即provider_id, summary_id, audience_id, onboarding_id)关联的模型如下所示:

提供者:

module.exports = (sequelize, DataTypes) => {
  const Provider = sequelize.define(
    'provider',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      providerName: {
        type: DataTypes.STRING
      },
      email: {
        type: DataTypes.STRING
      },
      privacyPolicy: {
        type: DataTypes.STRING
      }
    },
    {
      freezeTableName: true,
      tableName: 'provider'
    }
  );

  Provider.associate = models => {
    Provider.hasMany(models.Segment, { foreignKey: 'provider_id' });
  };

  return Provider;
};

概括:

module.exports = (sequelize, DataTypes) => {
  const Summary = sequelize.define(
    'summary',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      summaryName: DataTypes.STRING,
      standardIdName: DataTypes.STRING,
      description: DataTypes.STRING,
    },
    {
      freezeTableName: true,
      tableName: 'summary'
    }
  );

  Summary.associate = models => {
    Summary.hasMany(models.Segment, { foreignKey: 'summary_id' });
  };

  return Summary;
};

观众:

module.exports = (sequelize, DataTypes) => {
  const Audience = sequelize.define(
    'audience',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      refreshCadence: DataTypes.STRING,
      sourceLookbackWindow: DataTypes.STRING
    },
    {
      freezeTableName: true,
      tableName: 'audience'
    }
  );

  Audience.associate = models => {
    Audience.hasMany(models.Segment, { foreignKey: 'audience_id' });
  };

  return Audience;
};

入职:

module.exports = (sequelize, DataTypes) => {
  const Onboarding = sequelize.define(
    'onboarding',
    {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      onboardingExpansions: DataTypes.STRING,
      onboardingAudiencePrecision: DataTypes.STRING
    },
    {
      freezeTableName: true,
      tableName: 'onboarding'
    }
  );

  Onboarding.associate = models => {
    Onboarding.hasMany(models.Segment, { foreignKey: 'onboarding_id' });
  };

  return Onboarding;
};

我的问题是:创建和保存段记录时应该首先考虑什么?我是否首先创建并保存每个其他模型(提供者、摘要、受众、入职),然后创建/保存引用这些 ID 的细分?我真的不知道在这种情况下事件的顺序应该是什么。任何帮助深表感谢!谢谢!

标签: node.jsdatabasepostgresqlsequelize.js

解决方案


  • TLDR:

为了创建 的实例Segment,您必须让所有 4 个外键引用被引用表(、、和)上providersummary现有记录audienceonboarding

  • 解释:

provider, summary,audienceonboarding表是独立的。

但是,Segment模型不是独立的。
Segment模型有 4 列是外键。

来自 PostgresSql 教程:

外键是表中的一个字段或一组字段,用于唯一标识另一个表中的一行。换句话说,一个表中定义了一个外键,它引用了另一个表的主键。

包含外键的表称为引用表或子表。外键引用的表称为被引用表或父表。

这意味着外键是列应该引用被引用表的主键的约束。

因此,您必须创建一个已创建行的所有资源Segment


推荐阅读