【问题标题】:Saving Sequelize Record/Referencing it in Another Model保存 Sequelize 记录/在另一个模型中引用它
【发布时间】:2020-05-15 08:24:59
【问题描述】:

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

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_idsummary_idaudience_idonboarding_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.js database postgresql sequelize.js


    【解决方案1】:
    • TLDR:

    为了创建Segment 的实例,您必须让所有4 个外键都引用被引用表上存在的记录(providersummaryaudienceonboarding)。

    • 说明:

    providersummaryaudienceonboarding 表是独立的。

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

    From PostgresSql Tutorial:

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

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

    表示外键是列应该引用被引用表的主键的约束。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多