通过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的优点就没有了,所以停下脚步、尽量考虑轻量化是很重要的。
※ 我仍然是一个初学者。如果有任何错误的解释或实现,请指正。