Go语言 如何正确实现GraphQL解析器

vom3gejh  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(140)

我正在创建一个基本的Graphql项目。在这个项目中,我只获取用户的详细信息。数据存储在数据库中。下面是GQL模式:

  1. type User {
  2. id: ID!
  3. username: String!
  4. email: String!
  5. age: Int
  6. address : String
  7. firstname: String
  8. lastname :String
  9. }
  10. type Query {
  11. getUserById(id: ID!): User
  12. }

字符集
当客户端查询我的端点时,将涉及2个连接。

*连接1:从/到用户到我的解析程序。
*连接2:从/到我的解析器到我的数据库。

如果我没有请求某些字段,Graphql将帮助我保存Connection 1的带宽。
但是,在Connection 2中,每次都将请求和获取相同数量的数据,因为每次请求都运行相同的SQL查询。
例如,
此查询

  1. query {
  2. getUserById(id: "your_user_id_here") {
  3. id
  4. username
  5. email
  6. age
  7. }
  8. }


这个查询

  1. query {
  2. getUserById(id: "your_user_id_here") {
  3. id
  4. username
  5. email
  6. age
  7. address
  8. firstname
  9. lastname
  10. }
  11. }


这两种情况都触发了我后端的同一个解析器函数,它将为这两种情况运行相同的SQL查询(select id, email, username.....)。所以当请求的数据较少时,我不会在Connection 2中节省任何带宽。现在我的schema很小,但随着它的增加,这将成为一个更大的问题。
我的后端代码的底层库将确保只有请求的字段才会返回给用户。我使用gqlgen并研究了TypeGraphQL。在这方面,两者似乎工作相同。
我的问题是:我是否遗漏了一些graphql的概念,或者这真的是一个问题?如果是的话,关于如何改进我的解析器有什么建议吗?
我研究了一下,但找不到任何东西。

zbdgwd5y

zbdgwd5y1#

正如你所描述的,需要节省的重要带宽是在 * 连接1* 中。你的GraphQL服务器应该 * 靠近 * 你的数据库,并通过高速连接进行连接。这是典型的3层设计。
当你的模式变得越来越复杂时,你最终会得到计算字段和相关类型,如果客户端不请求这些字段,这些字段和相关类型将从查询计划中被删除(不执行)。
例如,我们不把age直接存储在数据库中(这总是一个坏主意),而是存储出生日期(或者至少是出生年份)。那么age将是一个具有自己解析器的计算字段。如果客户端没有请求age,那么解析器将不会运行。

相关问题