【问题标题】:How can I structure a Sequelize.js schema that will need complex joins?如何构建需要复杂连接的 Sequelize.js 架构?
【发布时间】:2014-10-30 22:14:49
【问题描述】:
我有一个Reviews 表,其中有一个SceneId。 Scene 模型有一个 MovieId,它引用 Movie。现在,如果我想获取属于某个Movie 的所有Reviews,我应该在Review 中复制MovieId,还是应该做一些疯狂的复杂加入?两者都有性能影响吗?
如果我要使用一个疯狂的复杂连接,我将如何在 Sequelize ORM 中执行它?
【问题讨论】:
标签:
mysql
join
database-schema
sequelize.js
【解决方案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