您如何在GraphQL中編寫查詢解析器,並且在關係數據庫中表現良好?什麼是解決相關對象的慣用,高性能的方法?
使用來自this tutorial的示例模式,假設我有一個簡單的數據庫,其中包含users
和stories
。用戶可以創作多個故事,但故事只有一個用戶作爲其作者(爲簡單起見)。
查詢某個用戶時,可能還需要獲取該用戶創作的所有故事的列表。一個可能定義一個GraphQL查詢來處理(從上面的鏈接教程被盜):
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});
}
}
})
});
預期這將工作;如果我查詢特定的用戶,如果需要的話,我也可以獲取該用戶的故事。但是,這並不理想。當需要使用JOIN
的單個查詢時,它需要兩次到數據庫。如果我查詢多個用戶,問題會被放大 - 每個額外的用戶都會導致額外的數據庫查詢。越深入地遍歷我的對象關係,問題就會呈指數級地惡化。
此問題是否解決?有沒有辦法編寫一個查詢解析器,不會導致生成低效的SQL查詢?
啊,我注意到'fieldASTs'參數之前,但現在我看到一個具體的用例,它變得更有意義。謝謝! – ean5533