2017-11-22 1 views
0

ich über GraphQL studieren, und ich würde verstehen, wie GraphlQL eine Abfrage liegen durchführen wird:GraphQL - Datenbank überladen?

poc (id: $id) { 
    tradingName 
    id 
    products{ 
     id 
     title 
     imageUrl 
     productVariants { 
     title 
     } 
     images{ 
     url 
     } 
    } 
    } 

Auf resolve_all_products werde ich nur Produkte für ID abfragen. z.B. select * from products where poc_id=10

Auf dem resolve_product_variants Knoten werde ich für alle Produktvarianten mit einer bestimmten Produkt-ID abfragen. z.B. select * from product_variants where product_id=X

Stellen Sie sich nun vor, dass ich 20 Produkte habe und jede von ihnen 2 Produktvarianten hat. Also werde ich eine Abfrage machen, um alle Produkte (20) und dann 20 mehr zu bekommen. Jeder von ihnen erhält alle Produktvarianten (2) von einem bestimmten Produkt.

Also statt einer einzigen Join-Abfrage werde ich 21 Abfragen durchführen. Habe ich recht? Gibt es trotzdem etwas zu verhindern?

Antwort

2

Ja, Sie haben Recht. Es wird 21 Abfragen durchführen. Dies wird als N + 1-Abfrageproblem bezeichnet.

DataLoader kann verwendet werden, um dies zu optimieren.

zunächst eine Dataloader definieren

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`) 
) 

Dann in dem Resolver für productVariants,

function productVariants(product) { // Resolver for productVariants 
    return productVariantsLoader.load(product.id) 
} 

Das ist es. Die Auflösung von productVariants wird möglicherweise mehrmals aufgerufen. Die übergebenen Produkt-IDs werden jedoch vom DataLoader erfasst und die SQL-Abfragefunktion wird nur einmal aufgerufen.