我有一个包含 SceneId
的 Reviews
表。 Scene
模型有一个 MovieId
,它引用了一个 Movie
。现在,如果我想获得属于某个 Movie
的所有 Reviews
,我应该在 Review
中复制 MovieId
还是我应该做一些疯狂的复杂加入吗?两者都对性能有影响吗?
如果我要使用疯狂的复杂连接,我将如何在 Sequelize ORM 中使用它?
最佳答案
取决于您运行查询的频率以及您想要的性能。
如果您将拥有大量数据,和/或您将经常运行查询,那么在 Review 中添加一个 movieId 可能是个好主意。这将为您提供更好的性能,因为您不必通过额外的表进行连接。
但是,这也意味着您必须自己做更多的簿记工作,以确保评论的电影 ID 始终与场景中的电影 ID 匹配。这可能可以在 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/