GraphQL Schema 设计的优化技巧及最佳实践

阅读时长 6 分钟读完

GraphQL 是一个非常强大的数据查询语言,通过定义一个 GraphQL Schema 可以实现前后端相对独立,灵活的数据交互。而一个优秀的 GraphQL Schema,不仅可以提高查询效率,还可以提高开发效率,减少沟通成本。本文将基于经验总结或讲解 GraphQL Schema 设计的优化技巧及最佳实践。

1. 抽象类型

在 GraphQL Schema 中使用抽象类型可以使 schema 更加灵活和复用性更强。GraphQL 通过 interfaceunion 类型来支持抽象类型,其中 interface 类型定义了一个共同的接口,而 union 则定义了一个值可以属于多个类型的联合。

举个例子,某个 app 需要实现一个领域驱动模型,要实现一个 Animal 接口类型,并继承多个子类型:

-- -------------------- ---- -------
--------- ------ -
  --- ---
  ----- -------
  ---- ----
-

---- --- ---------- ------ -
  --- ---
  ----- -------
  ---- ----
  ------ -------
-

---- --- ---------- ------ -
  --- ---
  ----- -------
  ---- ----
  ------ -------
-

这样定义之后,我们可以非常方便地查询或使用在接口类型上定义的方法或属性:

-- -------------------- ---- -------
-
  ---------- ---- -
    --
    ----
    ---
    --- -- --- -
      -----
    -
    --- -- --- -
      -----
    -
  -
-

这样既提高了查询效率,也实现了-schema的复用和扩展,并避免了一些潜在的性能问题。

2. 引用类型

在 GraphQL Schema 中,我们可能会经常遇到需要引用其他类型的情况。而使用 GraphQL 中的引用类型则是处理这类情况的最佳实践。

-- -------------------- ---- -------
---- ---- -
  --- ---
  ------ ------
  ------- ----
-

---- ---- -
  --- ---
  ----- ------
  ------ ------
-

其中,在定义 Post 类型时,可以通过 author: User 引用 User 类型。这样默认会通过 User 类型的 id 字段来找到对应的 User 对象,非常方便且直观。

3. 最小化无用查询

GraphQL 是通过查询语句定义出需要返回的数据结构的。而一个查询语句中如果包含了多余的字段或属性,则可能会增加无用的计算或网络请求。因此最佳实践中要尽量最小化无用查询。

-- -------------------- ---- -------
---- ---- -
  --- --
  ------ ------
  ------- ------
  ----------- -----------
-

---- --------- -
  --- --
  ----- ------
  -------- ------
-

---- ------ -
  --- --
  ----- ------
  ------ ------
  ------ ------
-

如上定义的 GraphQL Schema 中,如果不需要查询 Publisher 类型的信息,则可以使用如下的查询语句:

-- -------------------- ---- -------
-
  ----- -
    --
    -----
    ------ -
      ----
      -----
    -
  -
-

这样就能最小化无用查询并提高效率。

4. 分页

当我们需要处理大量数据时,分页是一种非常常见且有效的手段。而在 GraphQL Schema 中,分页可以通过 Connection/Edge 类型来实现。

-- -------------------- ---- -------
---- ---- -
  --- ---
  ------ -------
  ------- -------
-

---- ------ -
  --- ---
  ----- -------
  ------ -------
  ------------ ---- ------ -------- --------------------
-

---- -------------------- -
  --------- ---------
  ------ -----------------
-

---- -------------- -
  ------- -------
  ----- -----
-

---- -------- -
  ------------ ------
  ---------- ------
  ------------ --------
  ---------------- --------
-

其中定义了 AuthorBookConnectionAuthorBookEdge,用来返回分页后的数据。这样通过 firstafter 的参数就能实现分页的效果。

5. 关联类型

在 GraphQL Schema 中,我们常常会有关联类型的情况,比如 Order 关联到 CustomerProduct 关联到 Category 等。而 GraphQL Schema 中提供了 @relation 来支持关联类型的定义:

-- -------------------- ---- -------
---- ----- -
  --- ---
  --------- -------- ---------
  --------- --------------
-

---- -------- -
  --- ---
  ----- -------
  ------ -------
-

---- ------------ -
  --- ---
  ------ ----- --------------- ----------------
  -------- ------- ---------
  --------- ----
-

---- ------- -
  --- ---
  ----- -------
  --------- -------- ---------
-

---- -------- -
  --- ---
  ----- -------
-

通过 @relation 的定义,我们可以实现关联类型的查询或联表操作。

结语

这篇文章讲解了 GraphQL Schema 的一些优化技巧和最佳实践,其中包括了抽象类型、引用类型、最小化无用查询、分页以及关联类型的定义。我们相信这些技巧能够帮助你在设计 GraphQL Schema 方面更加得心应手,并提高开发效率。如果您还有其他的技巧或实践,也欢迎分享给我们。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649c25fb48841e98948f14db

纠错
反馈