如何构建需要复杂连接的Sequelize.js模式?

时间:2014-10-30 22:14:50

标签: mysql join database-schema sequelize.js

我有Reviews表,其中SceneIdScene模型的MovieId引用Movie。现在,如果我想获得属于某些Reviews的所有Movie,我应该复制MovieId中的Review还是应该进行一些疯狂的复杂加入?是否存在性能影响?

如果我要使用疯狂的复杂连接,我将如何在Sequelize ORM中进行此操作?

1 个答案:

答案 0 :(得分:1)

取决于您运行查询的频率以及所需的性能。

如果您要获得大量数据,并且/或者您要经常运行查询,那么在Review中添加movieId可能是个好主意。这将为您提供更好的性能,因为您不必通过额外的表加入。

但是,这也意味着您必须自己做更多的簿记,以确保Review的movieid始终与Scene中的movieid相匹配。这可能是使用sequelize中的钩子来实现的。

要进行加入,您可以这样做:

Scene.belongsTo(Movie)
Movie.hasMany(Scene)

Review.belongsTo(Scene)
Scene.hasMany(Review)

Movie.findAll({
    include: [
        { Model: Scene, include: [Review] }
    ]
});

使用JOIN的方法意味着您必须浏览每个场景并收集评论才能获得电影的所有评论,例如:

var reviews = movies.scenes.map(function (scene) {
    return scene.reviews
);
// Now we have an array of arrays of reviews

// Let's merge those into one:
reviews = Array.prototype.concat([], reviews);

然而,如果你反规范,你可以简单地做

Review.belongsTo(Movie) // add movieId to review

Movie.findAll({
    include: [
        Scene,
        Review
    ]
});

直接访问movie.reviews