我有一个 Reviews 表,它有一个 SceneIdScene 模型有一个 MovieId ,它指的是 Movie 。现在,如果我想获得属于某个 Reviews 的所有 Movie ,我应该在 MovieId 中复制 Review 还是应该进行一些疯狂的复杂连接?两者是否有性能影响?

如果我要使用一个疯狂的复杂连接,我将如何在 Sequelize ORM 中做到这一点?

最佳答案

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

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

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

要进行连接,您将执行以下操作:

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

关于mysql - 如何构建需要复杂连接的 Sequelize.js 架构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26664278/

10-12 23:54