Come si scrivono i risolutori di query in GraphQL che si comportano bene con un database relazionale?Qual è il modo idiomatico e performante per risolvere gli oggetti correlati?
Utilizzando lo schema di esempio da this tutorial, supponiamo di disporre di un semplice database con users
e stories
. Gli utenti possono creare più storie, ma le storie hanno solo un utente come autore (per semplicità).
Quando si esegue una query per un utente, si potrebbe anche voler ottenere un elenco di tutte le storie create da tale utente. Una possibile definizione di una query GraphQL per gestire tale (rubato dal tutorial sopra linkato):
const Query = new GraphQLObjectType({
name: 'Query',
fields:() => ({
user: {
type: User,
args: {
id: {
type: new GraphQLNonNull(GraphQLID)
}
},
resolve(parent, {id}, {db}) {
return db.get(`
SELECT * FROM User WHERE id = $id
`, {$id: id});
}
},
})
});
const User = new GraphQLObjectType({
name: 'User',
fields:() => ({
id: {
type: GraphQLID
},
name: {
type: GraphQLString
},
stories: {
type: new GraphQLList(Story),
resolve(parent, args, {db}) {
return db.all(`
SELECT * FROM Story WHERE author = $user
`, {$user: parent.id});
}
}
})
});
Ciò funzionerà come previsto; se interrogassi un utente specifico, sarei in grado di ottenere anche le storie di quell'utente se necessario. Tuttavia, questo non ha prestazioni ideali. Richiede due viaggi al database, quando una singola query con un JOIN
sarebbe stata sufficiente. Il problema si amplifica se interrogo più utenti: ogni utente aggiuntivo comporterà una query di database aggiuntiva. Il problema peggiora in modo esponenziale, più approfondisco le mie relazioni oggettuali.
Questo problema è stato risolto? Esiste un modo per scrivere un risolutore di query che non genererà query SQL inefficienti?
Ah, ho notato che il parametro 'fieldASTs' prima, ma ha molto più senso ora che vedo un caso d'uso concreto. Grazie! – ean5533