GraphQL-重载数据库?
我正在学习GraphQL,我想了解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
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查询函数将只调用一次