GraphQL 中的数据格式规范化之路

GraphQL 是一种用于前端开发的查询语言,通过它我们可以灵活地获取我们需要的数据,不必担心服务器返回冗余数据的问题。

但是,在使用 GraphQL 过程中,我们可能会遇到数据太过深层嵌套、重复请求等一系列问题。这时数据格式规范化就显得尤为重要,这样我们的代码可维护性更高,减少了出错的可能性。

数据规范化的思路

我们可以引入一个概念:归一化(Normalization)。它指的是将一段数据拆解成多个小的数据块,并且将这些小数据块统一地储存到一张表中,这样我们就可以根据小数据块的关系,来获取我们需要的数据。

GraphQL 中有一种操作叫 Fragments,它能够把查询分离成一些列的、可复用、可组合的模块。通过对 Fragment 的合理运用,我们可以构建出彼此独立的模块化组件。

实战示例

接下来,我们通过一个具体的示例来演示上述原理。假设我们现在正在打造一个音乐管理系统,每个音乐家可能会演唱多首歌曲,而我们需要查看该音乐家演唱过的每首歌曲的详细信息。

我们的查询语句可能是这样的:

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

通过上面的查询语句,我们就可以得到该音乐家的姓名、每首歌曲的详细信息以及每首歌的所在专辑的信息。但是,我们发现在每首歌曲信息的查询中,我们要查询 album 的每个字段信息,如果我们查询的歌曲数目很多,这将是一个很大的性能瓶颈。

这时,我们就可以走数据归一化的路线,对该数据进行规范化处理。

首先,我们可以把查询语句拆分成两部分,一个得到音乐家信息,一个得到每首歌曲的详细信息。

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

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

注意到,SongDetailsQuery 中我们只查询了每首歌曲的必要信息,我们还用 album_id 来代替 album 的信息,因为 album 的详细信息已经在前面的查询中被获取过了。

接下来,我们将状态统一保存到一个表中,我们的表长这样:

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

通过上面的数据表,我们可以轻松地得到我们需要的数据。我们通过一个查询函数来实现这个过程:

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

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

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

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

通过这个查询函数,我们可以组合上面的两个查询,来得到我们需要的数据。

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

这个函数接收一个音乐家的 id,然后返回该音乐家演唱的所有歌曲的详细信息,以及每首歌曲所在专辑的信息。此时,我们的数据就被成功地规范化了。

总结

在我们的实战示例中,我们将数据规范化分成两步来实现:

  1. 拆解查询语句,只获取必须的信息并走向数据库查询。
  2. 数据库返回归一化的数据表,并提供一个查询函数对查询结果进行组装。

通过上述的流程,我们成功地将数据规范化,提高了性能,也增强了代码的可读性和可维护性。对于龟毛的前端开发者而言,当然是非常具有指导意义的。

参考文献

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6478504e968c7c53b048ecaa


猜你喜欢

  • 如何使用 Node.js 实现多线程操作

    在前端开发中,有很多需要处理大量数据的操作,例如文件上传、图片处理等,这些操作都需要很长的时间来完成。为了提高效率,我们可以通过多线程来加速处理这些操作。本文将详细介绍如何使用 Node.js 实现多...

    1 年前
  • Mongoose 中如何使用 findById 方法进行查找操作

    Mongoose 是 Node.js 中一个非常流行的 MongoDB 驱动程序,它能够让我们通过简单的 JavaScript 代码就能够对 MongoDB 数据库进行管理、操作和查询,大大简化了 N...

    1 年前
  • Material Design 中实现内容转场效果的方法分享

    前言 Material Design 是由 Google 推出的设计语言,它被广泛应用于 Android、Web 和其他平台的设计中。内容转场效果是 Material Design 中非常流行的交互设...

    1 年前
  • Socket.io 技术实现案例分享:基于 Vue.js 的实时投票应用

    随着现代 Web 应用愈加丰富和复杂,用户对实时互动和反馈的需求也越来越高。为了克服 Web 应用传统的 HTTP 协议无法同时支持实时交互的缺点,Socket.io 作为实时技术的主流方案,越来越被...

    1 年前
  • RESTful API 如何使用 Swagger UI 文档化 API?

    RESTful API 是一种常见的 API 设计风格,它基于 HTTP 协议,以资源为核心,通过 HTTP 方法进行操作,使得 API 的设计更加简洁、易于扩展和维护。

    1 年前
  • Redux 中封装 API 的最佳实践

    引言 随着前端开发的不断发展,越来越多的应用开始采用 Redux 这样的状态管理库。Redux 提供了一个非常好的数据流方案,使得我们可以轻松地实现一个可靠的应用状态管理系统。

    1 年前
  • 使用 MongoDB 作为分布式锁实现

    什么是分布式锁 在分布式系统中,多个节点可能同时访问共享资源,而它们的读写操作可能会产生冲突。为了避免这种情况,我们需要引入锁机制来进行同步控制,保证数据的一致性。

    1 年前
  • 看这里,Flexbox 真心有点累!

    在前端开发中,布局通常是一个非常重要的部分。而在布局中,Flexbox 是一个经常被使用的工具。Flexbox 是 CSS3 提供的一种新的布局方式,它可以让我们使用 CSS 快速地构建灵活和响应式的...

    1 年前
  • ES11 中如何使用 Promise.finally

    在前端开发中,很多时候我们需要处理异步操作。Promise 是一种常用的处理异步操作的方式,而 Promise.finally 则是 ES11 中的一个新特性,它允许我们在 Promise 执行结束后...

    1 年前
  • 将 Web Components 集成到 Angular 应用中的最佳实践

    简介 Web Components 是一种用于创建可重用组件的浏览器技术。它通过自定义元素、影子 DOM 和 HTML 模板提供了一种构建组件的标准方式。Angular 是一种用于构建 Web 应用程...

    1 年前
  • Next.js 实践:自定义 webpack 配置

    前言 Next.js 是一款基于 React 的 SSR(服务端渲染)框架,它提供了许多开箱即用的功能,如文件系统路由、静态导出、动态导入等。但在某些场景下,我们需要进行一些自定义的 webpack ...

    1 年前
  • ECMAScript 2021 中的 Map/Set 中的对称差

    随着前端应用的不断增加,数字集合操作已成为许多前端开发人员需要进行的基本操作之一。ECMAScript 2021 中,Map 和 Set 扩展了新的功能,包括对称差。

    1 年前
  • 如何在 React Native 中使用 ESLint 进行静态代码分析

    作为一名前端开发人员,我们经常需要写出良好的代码,这不仅让我们的工作更加高效和愉悦,还能提高代码的质量和可读性。在 React Native 中,我们可以使用 ESLint 进行静态代码分析,以帮助我...

    1 年前
  • 在 Deno 中使用 Docker 部署应用程序

    随着 Deno 越来越流行,越来越多的开发者开始关注 Deno 的部署方式。而 Docker 作为一个强大的容器化工具,也被越来越多的人用于部署 Deno 应用程序。

    1 年前
  • Vue-Router 在 SPA 应用中的应用

    单页面应用 (Single Page Application, SPA) 是一种现代的 Web 应用程序开发模式,其在用户的浏览器客户端上只加载一次 HTML 页面,之后所有的操作都在这个页面上进行,...

    1 年前
  • 使用 Server-sent Events 实现后端服务的异步调用

    随着 Web 技术的发展,前端工程师在面临异步通信、实时更新等问题时,逐渐将目光瞄向了 Server-sent Events(SSE)。SSE 是一种基于 HTTP 的技术,用于在客户端和服务器之间建...

    1 年前
  • 如何在 .NET 中使用 GraphQL

    GraphQL 是一种用于构建 API 的查询语言,它是一种客户端驱动的数据查询语言,能够减少网络传输量,提高数据查询效率。在前端开发中,GraphQL 可以为前端工程师提供更友好、更高效的数据交互方...

    1 年前
  • Serverless的事件触发机制及应用实践

    Serverless是一种新的应用程序设计和部署范式,它利用云计算资源和后端服务,使开发人员可以更快地开发和部署应用程序。Serverless的主要特点是通过事件触发机制来驱动应用程序的处理流程,这一...

    1 年前
  • Koa 框架日志记录及管理的最佳实践

    Koa 是一个新一代的 Node.js Web 框架,它基于异步/字节流的方式,采用中间件机制来实现自身的一些核心功能,比如路由分发、错误处理、请求响应处理等。同时,Koa 还提供了极佳的扩展能力,允...

    1 年前
  • Chai.js 断言应用 —— 基于 jQuery 的卡片拖拽排序功能测试用例

    前言 在前端开发中,卡片拖拽排序功能是比较常见的一种需求,实现该功能的前提是需要进行测试,以保证其稳定性和可靠性。本文将介绍如何使用 Chai.js 进行断言应用,以测试基于 jQuery 的卡片拖拽...

    1 年前

相关推荐

    暂无文章