我正在研究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次查询,而不是单个连接查询。我对吗? 反正有没有阻止这个?
答案 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查询函数只会被调用一次。