GraphQL - 数据库过载?

GraphQL - Overloading database?

我正在研究 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 个查询,而不是单个连接查询。我对吗? 有什么办法可以防止这种情况吗?

是的,你是对的。它将执行 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 查询函数将仅调用一次。