GraphQL 是一个现代化的 API 查询语言,它提供了一种能够在客户端和服务器之间进行数据查询和操作的方式。GraphQL 通过丰富的查询语法和类型系统,将客户端与服务器之间的数据传输变得更加高效和灵活。而要使用 GraphQL,我们需要将其与数据存储技术结合起来,以便于在 API 中处理和存储数据。
本文将介绍如何在 GraphQL 中处理持久化数据,探讨 GraphQL 与数据库的集成方式,并遵循最佳实践。
数据库集成方式
在 GraphQL 中,数据库是通过数据源(data source)来表示的。数据源是负责管理数据库连接、查询数据、执行修改操作等任务的对象。
GraphQL 的一个优点是它在接口层上与数据源相分离,使得更换数据源成为可能。这样,开发者可以在不更改 GraphQL API 的前提下,将其与不同的数据源进行集成。
以下是在 GraphQL 中进行数据源集成的三种方式:
直接连接数据库
GraphQL API 可以直接通过 JDBC 或 ODBC 连接数据库进行数据查询和修改。这种方法是最简单也是最常见的集成方式,它不需要额外的中间件或服务。
一个典型的直接连接到数据库的例子:
-- -------------------- ---- ------- ---- ----- - -------- ------ ---- - ---- ---- - --- ---- ----- ------- ---- --- - ----- ---------- - - - --- -- ----- -------- ---- -- -- - --- -- ----- ------ ---- -- -- - --- -- ----- -------- ---- -- -- -- ----- --------- - - ------ - ----- -------- ----- -- - ----- ------ - -------- ----- ---- - -------------------- -- ------- --- -------- ------ ----- -- -- --
在上面的示例中,我们定义了一个 Query
类型,用于查询关于用户(User
)对象的信息。然后,我们使用一个名为 resolvers
的对象来定义如何解析查询。因为我们没有用实际的数据库,所以使用了一个模拟的用户表。
数据访问层(Data Access Layer)
数据访问层(Data Access Layer)是将 GraphQL API 与数据库数据访问方法进行解耦的一种方式。它通过中间层来管理数据访问和修改,从而使我们能够轻松地将其与不同的数据库进行集成。
以下是一个使用 knex.js
数据访问层的完整示例:
-- -------------------- ---- ------- ----- ---- - ----------------- ------- ----- ----------- - ----- ------------ --------- -------------- -- --- ----- --------- - - ------ - ----- -------- ----- -- --------------------- --- ------- ----------- -- --
在上面的示例中,我们将 knex
的 where()
方法作为查询条件传递给 Query
类型。 knex
是一个流行的 SQL 查询生成器,可以与多个 SQL 数据库进行集成。
数据访问对象层(Data Access Object Layer)
数据访问对象层(Data Access Object Layer)是一种通过对象表示数据源之间关系和查询语义的方法。它类似于面向对象的编程,用于将数据访问逻辑与 GraphQL API 解耦。
以下是一个使用 typeorm
的数据访问对象的示例:
-- -------------------- ---- ------- --------- ----- ---- - ------------------------- --- ------- --------- ----- ------- --------- ---- ------- - ----- -------------- - -------------------- ----- --------- - - ------ - ----- -------- ----- -- -------------------------------- -- --
在上面的示例中,我们定义了一个 User
数据访问对象,对应一个具有 id
、name
和 age
属性的表。然后,我们使用 userRepository
定义查询方法。这种方式优化了数据源之间的关系和查询语义处理,并且提高了代码的可复用性。
最佳实践
在使用 GraphQL 时,为了使 GraphQL API 更加可维护和可扩展,应该遵循一些最佳实践。
以下是一些最佳实践:
避免使用 N+1 查询
GraphQL 允许开发者查询涉及到多个数据源的复杂操作。然而,这种操作有时可能由于 GraphQL API 的懒加载特性造成大量的多次数据库查询,导致性能问题(N+1 查询问题)。
为了避免 N+1 查询问题,GraphQL 提供了 DataLoader
实用程序。DataLoader
可以帮助开发者对相同查询进行缓存并对它们进行批量获取,以减轻 API 负担。
以下是使用 DataLoader
的示例:
-- -------------------- ---- ------- ----- ---------- - ---------------------- ----- ---------------- - ----- ----- -- - ----- ----- - ----- --------------------------- ----- ----- -------- - -------------------------- ----- -- - -------------------- - ----- ------ ------------ -- ---- ------ ---------- -- -------------- -- ----- ---------- - --- ----------------------------- ----- --------- - - ------ - ----- -------- ----- -- ------------------------- -- --
在上面的示例中,我们将批处理函数 batchGetUserById
用于查询 users
表中的条目。DataLoader
将帮助我们将需要获取的用户 ID 传递给这个函数,并且在可能的情况下对查询进行合并。
设计易于使用和维护的数据模型
数据模型是 GraphQL API 的基础,因此设计一个易于使用和易于维护的数据模型是非常重要的。
以下是一些在设计数据模型时应该注意的事项:
- 保持类型简单和易于理解。
- 对多个关于同一对象的操作进行分组。
- 在类型名称和对象属性名称上使用有意义的名称。
- 使用 GraphQL 枚举类型和接口类型。
- 推荐使用
@deprecated
标记来标记已弃用的字段。
对 API 进行认证和授权
GraphQL 并没有内置的认证和授权层,因此开发者需要手动为其实现。在实现 GraphQL API 时,应该使用安全套接字层(SSL)和授权令牌进行 API 认证和授权。
以下是做好 GraphQL API 认证和授权应遵循的一些最佳实践:
- 使用 HTTPS 和 SSL 证书来保护 API。
- 为每个合法请求颁发访问令牌。
- 验证请求的来源和目标。
结论
本文介绍了 GraphQL 与数据库集成的几种方式,并探讨了设计 GraphQL API 时需要遵循的最佳实践。在处理持久化数据时,开发者应该根据数据源之间的关系和查询语义,选择适当的集成方式。在 API 设计方面,开发者应该保持类型简单且易于理解;在实现认证和授权时,应该使用安全套接字层(SSL)和授权令牌保护 API。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6753a2958bd460d3ada677d3