在续集中使用模型集合作为数据类型

时间:2015-03-16 18:05:09

标签: node.js postgresql sequelize.js

背景

这是针对产品数据库原型,每个产品可以有多个相关产品,并且每个关系都有一个类型,例如: '配件','备件','与','类似于'等。

技术

我们在节点上使用sequelize js来定义模型。

模型片段:

sequelize.define('Product', {
  id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
  name: { type: DataTypes.STRING, allowNull: false, comment: 'product name'}
  ...
});

sequelize.define('ProductRelationType', {
   id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
   name: { type: DataTypes.STRING, allowNull: false, comment: 'relationship type description' }
});

sequelize.sync({force: false}).then( function() {
   ...
});

问题

是否可以在Sequelize中使用模型本身作为数据类型,以在另一个表中建立集合,例如:

sequelize.define('ProductRelation', {
   id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
   relatedProduct: { type: Product } //reference to product model
});

然后是:

Product.hasMany(ProductRelation, { as: 'relatedProducts' });
ProductRelation.hasOne(ProductRelationType, { as: 'RelationType' } );

或者,排除ProductRelation表定义,并使用:

db.Product.hasMany(db.Product, { through: 'RelatedProduct' } );
db.RelatedProduct.hasMany(db.Product, { through: 'RelatedProduct' } );

注意:这些是概念示例,它们不起作用。

赞赏任何建议或替代建模方法。

谢谢

1 个答案:

答案 0 :(得分:0)

看来,您想要的只是建立从ProductProduct的n:m关系。

实现目标的唯一方法是建立一个link-(或“through-”)表。您可以手动执行此操作,也可以Sequelize使用belongsToMany自动执行此操作:

var RelatedProducts = sequelize.define('RelatedProducts', {
    // other columns here
});

Product.belongsToMany(Product, { through: RelatedProducts, foreignKey: 'relatedProductId' });
Product.belongsToMany(Product, { through: RelatedProducts });