【问题标题】:GraphQL - Overloading database?GraphQL - 重载数据库?
【发布时间】:2018-05-06 19:58:28
【问题描述】:

我正在研究 GraphQL,我想了解 GraphlQL 将如何执行查询谎言:

  poc (id: $id) {
    tradingName
    id
    products{
      id
      title
      imageUrl
      productVariants {
        title 
      }
      images{
         url
      }
    }
  }

resolve_all_products 上,我将只查询产品的id。 例如select * from products where poc_id=10

resolve_product_variants 节点上,我将查询具有特定产品ID 的所有产品变体。 例如select * from product_variants where product_id=X

现在假设我有 20 种产品,每种产品都有 2 个产品变体。 因此,我将进行一次查询以获取所有产品 (20),然后再获取 20 个。他们每个人都将从特定产品中获取所有产品变体 (2)。

因此,我将执行 21 个查询,而不是单个连接查询。我对吗? 有没有办法防止这种情况发生?

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    是的,你是对的。它将执行 21 个查询。这称为 N+1 查询问题。

    DataLoader 可以用来优化这个。

    首先定义一个DataLoader

    const DataLoader = require('dataloader');
    const productVariantsLoader = new DataLoader((productIds) => // productIds will be an array of product ids
      sql.table.query(`select * from product_variants where product_id in $productIds`)
    )
    

    然后在productVariants的解析器中,

    function productVariants(product) { // Resolver for productVariants
      return productVariantsLoader.load(product.id)
    }
    

    就是这样。现在 productVariants resolve 可能会被调用很多次;但是传入的产品id会被DataLoader收集,SQL查询函数只会被调用一次。

    【讨论】:

      猜你喜欢
      • 2020-09-17
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 2018-08-31
      • 2019-02-02
      相关资源
      最近更新 更多