GraphQL - 重载数据库?

时间:2017-11-22 23:50:36

标签: graphql graphql-js

我正在研究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次查询,而不是单个连接查询。我对吗? 反正有没有阻止这个?

1 个答案:

答案 0 :(得分:2)

是的,你是对的。它将进行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查询函数只会被调用一次。