【发布时间】:2022-06-14 20:33:09
【问题描述】:
我正在使用 Prisma 来实现 GraphQL 接口,以公开存储在 PostgreSQL 数据库中的一些数据。我的代码受到GraphQL Tools (SDL-first) example 的启发。不过这个逻辑效率很低,我想改进一下。
这是显示问题并寻求解决方案的最少代码段。我的真实代码当然更复杂。
我的 GraphQL 架构
type Query {
allUsers: [User!]!
}
type User {
name: String!
posts: [Post!]!
}
type Post {
text: String!
author: User!
}
我的解析器对象,在 Node.JS 代码中
const resolvers = {
Query: {
allUsers: ()=>prisma.users.findMany()
},
User: {
posts: (user)=>prisma.posts.findMany({where:{author:user.id}})
}
};
问题
此代码有效,但效率低下。假设您正在运行查询{allUsers{posts{text}}}:
-
我的代码对 PostgreSQL 运行 N+1 个查询来获取整个结果:一个来获取用户列表,然后另一个 N:每个用户一个。使用 JOIN 的单个查询就足够了。
-
我的代码从它查询的每个表中选择每一列,即使我只需要
user.id而不需要user.name或其他任何东西。
问题
我知道 Prisma 支持 nested searches (include and select options) 可以解决这两个问题。但是我不知道如何使用 GraphQL 查询配置选项对象。
如何从 GraphQL 查询中提取请求的字段列表?以及如何使用这些来创建选项对象以使用 Prisma 执行最佳嵌套搜索?
【问题讨论】: