mysql - 如何构建需要复杂连接的 Sequelize.js 架构?

标签 mysql join database-schema sequelize.js

我有一个包含 SceneIdReviews 表。 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/

相关文章:

mysql - 多个数据库条目或一个数组?

mysql - 如何在 Laravel 5.1 中编写这个(左连接,子查询)?

optimization - Erlang:优化复杂的qlc

join - Fluent NHibernate 连接另一个表中的单列

sql - Alter语句与外键冲突,但ID在两个表中都存在

C# 自动模式比较 SQL 数据库列表和更新

php - 加载存储在数据库中的图像时出错

php - 从变量(图像)获取文件内容

mysql - 协助查询逻辑和操作顺序

sql-server - 将主键添加到生产数据库