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-запроса будет вызываться только один раз.

Другие вопросы по тегам