Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GraphQL-重载数据库?_Graphql_Graphql Js - Fatal编程技术网

GraphQL-重载数据库?

GraphQL-重载数据库?,graphql,graphql-js,Graphql,Graphql Js,我正在学习GraphQL,我想了解GraphQL将如何执行查询: poc (id: $id) { tradingName id products{ id title imageUrl productVariants { title } images{ url } } } 在resolve_all_products上,我将仅查询产品的id

我正在学习GraphQL,我想了解GraphQL将如何执行查询:

  poc (id: $id) {
    tradingName
    id
    products{
      id
      title
      imageUrl
      productVariants {
        title 
      }
      images{
         url
      }
    }
  }
resolve_all_products
上,我将仅查询产品的id。 e、 g.
从poc_id=10的产品中选择*

resolve\u product\u variants
节点上,我将查询具有特定产品id的所有产品变量。 e、 g.
从product_id=X的product_变体中选择*

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

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

是的,你说得对。它将进行21次查询。这称为N+1查询问题

可以用来优化这一点

首先定义一个数据加载器

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`)
)
然后在
产品变体的解析器中

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

就这样。现在productvariationresolve可能会被多次调用;但是传递的产品ID将由DataLoader收集,SQL查询函数将只调用一次。

是的,您是对的。它将进行21次查询。这称为N+1查询问题

可以用来优化这一点

首先定义一个数据加载器

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`)
)
然后在
产品变体的解析器中

function productVariants(product) { // Resolver for productVariants
  return productVariantsLoader.load(product.id)
}
就这样。现在productvariationresolve可能会被多次调用;但传递的产品ID将由DataLoader收集,SQL查询函数将只调用一次