通过Apollo+Express开始学习GraphQL超入门~ 数据查询层2

概述

1. 用Apollo+Express入门GraphQL ~ 简单理解GraphQL
2. 用Apollo+Express入门GraphQL ~ 数据获取级别1

关于GraphQL的设计

根据GraphQL的作者所说,“GraphQL的原则是保持轻量化”,因此不建议使用过深的嵌套。

为什么

当我实际遇到的例子是,当我尝试使用GraphQL来实现简易电子商务网站时,我想创建一个能够通过GraphQL获取用户购买历史记录的API。

type User {
  id: ID!
  name: String!
  purchase_history: [Item]
}
type Item {
  id: ID!
  name: String!
  catch_copy: String
}

尝试以将购买记录附加到用户类型中的形式进行实现。

然而,如果采用这种方法时,获取用户的id和name时会触发获取购买历史的逻辑。
一般来说,购买历史是与商品相关联的数据,获取成本很高
即使有缓存,最好还是以只运行必要的信息的形式进行实现。

你打算怎么办?

由于GraphQL可以将查询打包在一起,因此可以创建一个新的查询以获取想要的信息,该查询将汇总已经创建好的查询。

在后端实现的查询

type Query {
  user(id: String!): User
  purchase_history(user_id: String!): [Purchase]
}

用户 → 可以获取到ID和用户名等信息
购买历史 → 可以获取用户的购买历史
每个查询只需指定 user_id 就可以获取到用户的信息

然而,如果继续这样使用,由于请求会变成两个,无法充分发挥GraphQL的特性。

将查询合并为一个。

请定义一个查询,以使用户和购买历史能够在一个查询中被获取。

query getUserPurchaseHistory($user_id: String) {
  user(id: $user_id) {
    id
    name
  }
  purchase_history(user_id: $user_id) {
    id
    name
    catch_copy
  }
}

通过向getUserPurchaseHistory传递user_id,可以在一个请求中获取两个信息。通过这样做,可以在需要的时候获取所需信息,并且只在必要时执行费用高昂的处理。

总结

通过了解GraphQL的强大之处,我理解了保持GraphQL尽可能轻薄的意义和目的。

在设计中,如果不小心变得嵌套层次很深,可能会导致大量生成只被部分使用的查询。如果变成这样,那GraphQL的优点就没有了,所以停下脚步、尽量考虑轻量化是很重要的。

※ 我仍然是一个初学者。如果有任何错误的解释或实现,请指正。

广告
将在 10 秒后关闭
bannerAds