GraphQL单向关联场景下User关联Workout是否必须添加反向链接?
问题解答
一、是否必须在Workout中添加指向User的关联?
不需要。你当前写的Schema本身已经可以满足「User关联一组Workout」的需求,只要给User类型的workouts字段编写对应Resolver即可:Resolver逻辑可以根据当前查询的User唯一标识(比如email或者后续可以加的id字段),去数据库查询该用户关联的所有Workout记录返回即可,不需要在Workout类型中额外加指向User的字段。
二、可选的其他实现方案
除了你当前用的「User嵌套workouts字段」的方案外,还有两种常见的实现方式:
- 新增独立Query查询入口:在
Query类型中新增findWorkoutsByUserEmail(email: String!): [Workout!]!字段,适合不需要每次查询User都带出Workout、或者需要单独拉取用户Workout列表的场景,这种方案甚至可以不用在User类型中声明workouts字段。 - 数据库层关联、Schema按需暴露:如果你用的是带关联查询能力的ORM(比如Prisma、TypeORM),只需要在数据库的Workout表中存储关联的用户ID作为外键,Schema层面暴露什么关联字段完全按需决定,不需要为了满足关联查询强行加不需要的字段。
三、关于循环调用的顾虑
你担心的user>workout>user>workout循环问题完全可以避免:
- 只要你不在Workout类型中加指向User的字段,从根源上就不会出现这种循环结构。
- 就算业务需要加双向关联,GraphQL本身也不会主动触发死循环,因为查询结构完全由前端请求指定,前端不会主动写多层嵌套的无意义查询,你也可以在服务端添加查询深度限制中间件,禁止深度超过合理范围(比如3-5层)的请求,完全规避这个问题。
小优化建议
建议你给Workout类型加唯一ID字段:id: ID!,方便后续做Workout的更新、删除、精准查询等操作。
内容的提问来源于stack exchange,提问作者tomcajot
相关产品推荐
相关产品推荐

