GraphQL - перегрузка базы данных?
Я изучаю GraphQL и хотел бы понять, как GraphlQL будет выполнять ложь запроса:
poc (id: $id) {
tradingName
id
products{
id
title
imageUrl
productVariants {
title
}
images{
url
}
}
}
На resolve_all_products
Я буду запрашивать только продукты для идентификатора. например select * from products where poc_id=10
На resolve_product_variants
узел i будет запрашивать все варианты продукта с определенным идентификатором продукта. например select * from product_variants where product_id=X
Теперь представьте, что у меня есть 20 продуктов, и у каждого из них есть 2 варианта продукта. Поэтому я сделаю один запрос, чтобы получить все товары (20), а затем еще 20. Каждый из них получит все варианты продукта (2) от конкретного продукта.
Поэтому вместо одного запроса на соединение я сделаю 21 запрос. Я прав? Есть ли способ предотвратить это?
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 может вызываться много раз; но переданные идентификаторы продукта будут собраны DataLoader, а функция SQL-запроса будет вызываться только один раз.