javascript - Bookshelf.js/Knex.js 嵌套在单个查询中的位置

标签 javascript orm bookshelf.js knex.js

如何在 bookshelf.js 中组合相关模型的查询?

就目前情况而言,ORM 向数据库发出两个单独的查询,我想将其合并。来自 sequelize 可能是这样的:

Model.find({
  where: {
    someField: 'someValue'
  },
  include: [{
    model: OtherModel,
    as: 'otherModel',
    where: {
      someOtherField: 'someOtherValue' <--- part of the same query
    }
  }]
})

我当前在 bookshelf.js 中的设置(设置了 ModelOtherModel 之间的关系):

Model
  .where({ someField: 'someValue' })
  .fetch({ withRelated: [{
    otherModel: q => q.where({ 
      someOtherField: 'someOtherValue' 
    })
  }] });

这有效,除了 knex.js 调试器显示针对数据库执行的两个单独的查询。我希望 bookshelf 能够足够智能地构建连接到单个查询的 SQL。

这可以通过配置或任何其他方式来避免吗?

最佳答案

这花了我很长时间才弄清楚,但多重查询行为是设计使然的。与连接相比,书架更喜欢多个未连接的往返,但不支持 N+1。每个表查询一次。通过分解查询,如果由于节点的异步特性而有多个连接到单个表,则可以并行运行一些查询。这种权衡对于深层嵌套关系没有意义,但对于具有许多第一代关系的数据模型可能有意义。我从未检查过是否存在任何类型的事务或行锁定。

您可以使用 Knex ( http://knexjs.org/#Builder-join ) 强制连接并将其混合到您的书架代码中,但对于除时间最敏感和优化的应用程序之外的所有应用程序,您可能不会注意到开销,除非数据库的延迟是穷。

如果您正在执行非常复杂的查询,其中需要连接来提高性能,我可能建议仅使用 knex 或 knex.raw 而不是 bookshelf。

关于javascript - Bookshelf.js/Knex.js 嵌套在单个查询中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39401892/

相关文章:

java - 强制开发人员使用Builder来构建实例

c# - 如何使用 EntityFramework 构建富领域模型

javascript - 如何在循环内以编程方式命名 1000 个文本框

php - 如何在 Doctrine 2 中自动刷新?

javascript - 如何使用 jQuery 和 JavaScript 防止文本字段失去焦点?

node.js - 限制 Bookshelf 模型上的 Knex 查询仅返回 n 条记录

node.js - 如何使用 bookshelf-pagemaker 添加简单的Where子句

node.js - "no such table: users"测试和使用 Bookshelf/Knex 时

Javascript 文件加载后备。 document.write() 的替代方案

javascript - 可以在 d3.js 中使用固定圆圈大小的圆包布局吗?