首页 > 其他分享 >什么是 GraphQL?

什么是 GraphQL?

时间:2023-09-08 15:02:09浏览次数:45  
标签:什么 评论 帖子 API Facebook GraphQL 数据

作者:Cat Chen
链接:https://www.zhihu.com/question/264629587/answer/949588861
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

GraphQL 是一种针对 Graph(图状数据)进行查询特别有优势的 Query Language(查询语言),所以叫做 GraphQL。它跟 SQL 的关系是共用 QL 后缀,就好像「汉语」和「英语」共用后缀一样,但他们本质上是不同的语言。GraphQL 跟用作存储的 NoSQL 没有必然联系,虽然 GraphQL 背后的实际存储可以选择 NoSQL 类型的数据库,但也可以用 SQL 类型的数据库,或者任意其它存储方式(例如文本文件、存内存里等等)。

GraphQL 最大的优势是查询图状数据。GraphQL 是 Facebook 发明的,我可以用 Facebook 做例子。例如说,你要在 Facebook 上打开我的页面查看我的信息,你需要请求如下信息:

  • 我的名字
  • 我的头像
  • 我的好友(按他们跟你的亲疏程度排序取前 6):
    • 好友 1 的名字、头像及链接
    • 好友 2 的名字、头像及链接
    • ……
  • 我的照片(按时间倒序排序取前 6):
    • 照片 1 及其链接
    • 照片 2 及其链接
    • ……
  • 我的帖子(按时间倒序排序):
    • 帖子 1:
      • 帖子 1 内容
      • 帖子 1 评论:
        • 帖子 1 评论 1:
          • 帖子 1 评论 1 内容
          • 帖子 1 评论 1 作者名字
          • 帖子 1 评论 1 作者头像
        • 帖子 1 评论 2:
          • ……
        • ……
    • 帖子 2:
      • 帖子 2 内容
      • 帖子 2 评论:
        • ……
    • ……

这是一个超级复杂的树状结构,如果我们用常见的 RESTful API 涉及,每个 API 负责请求一种类型的对象,例如用户是一个类型,帖子是另一个类型,那就需要非常多个请求才能把这个页面所需的所有数据拿回来。而且这些请求直接还存在依赖关系,不能平行地发多个请求,例如说在获得帖子数据之前,无法请求评论数据;在获得评论数据之后,才能开始请求评论作者数据。

如何解决这种问题?一个简单粗暴的办法是专门写一个 RESTful API,请求上述树状复杂数据。但很快新问题就会出现。现在 Facebook 想要做一个新的产品,例如说是宠物,然后要在我的页面上显示我的宠物信息,那这个 RESTful API 的实现就要跟着改。

GraphQL 能够很好地解决这个问题,但前提是数据已经以图的数据结构进行保存。例如上面说到的用户、帖子、评论是顶点,而用户跟用户发过的帖子存在边的关系,帖子跟帖子评论存在一对多的边,评论跟评论作者存在一对一的边。这时候如果新产品引入了新的对象类型(也就是顶点类型)和新的边类型,那没有关系。在查询数据时用 GraphQL 描述一下要查询的这些边和顶点就行,不需要去改 API 实现。


说完了 GraphQL 是什么和能解决什么问题,说说不够好的地方吧。

第一,Facebook 从来没有公开自己的 GraphQL 后端设计,使得大家必需要用第三方的,但体验显然不如我们在 Facebook 内部使用 GraphQL 好。我上面说了,数据必需已经以图的数据结构进行存储才有优势。Facebook 内部有非常好的后端做好了这件事情,而且还内置了基于隐私设置的访问控制。例如说你发的帖子有些是所有人可见的、有些是好友可见的、有些是仅同事可见的,我在打开你的页面时 Facebook 有一个中间层保证了根据我和你的关系我只能看到我该看到的帖子。GraphQL 在这一层之上,所以无论 GraphQL 怎么写我都不可能看到我不该看到的信息

第二,并不是所有场景都适用于 GraphQL 的,有些很简单的事情就应该用 RESTful API 来实现。Facebook 内部用户增长部门的很多 API 都还不是 GraphQL,因为没必要迁移到 GraphQL。用户增长部门的 API 处理新用户注册、填写短信验证码之类的事情,这些事情都是围绕着一个用户的具体某项或多项信息发生的,根本没有任何图的概念。可以强行写作 GraphQL,但得不到显著的好处。既然老的 API 早就写好了,需要的时候做一些小改动,但没必要重写。

第三,GraphQL 尽管查询的数据是图状数据结构,但实际获得的数据视图是树状数据结构。每一个 GraphQL 查询或更新都有自己的根节点,然后所有的数据都是从根结点展开出去的。查询后获得的数据如果要在前端重新变回图的状态,那前端就不能简单地缓存查询得到的数据,必须用对用的 GraphQL 存储库,然后通过顶点的 ID 把不同节点之间的某些边重新连接起来。

发布于 2019-12-25 12:42  

标签:什么,评论,帖子,API,Facebook,GraphQL,数据
From: https://www.cnblogs.com/sexintercourse/p/17687609.html

相关文章

  • 数字孪生技术结合GIS系统能在农业领域作出什么改变?
    数字孪生技术和地理信息系统(GIS)是两个独立但高度互补的领域,它们的结合在农业领域具有巨大的潜力,可以带来巨大的改变。在这篇文章中,我们将讨论数字孪生技术和GIS系统如何协同作用,为农业带来创新和可持续性。GIS是一种将地理空间数据与信息技术相结合的强大工具。GIS可以用来分析......
  • 什么是 Angular 应用 angular.json 中的 assets 数组
    在Angular项目中,angular.json是一个非常重要的配置文件,用于定义和管理项目的各种设置和构建选项。其中,assets数组是angular.json中的一个关键配置项,用于指定需要在构建后包含在应用程序中的静态资源文件和文件夹。在本文中,我将解释什么是assets数组,并提供详细示例来说明如何使用它......
  • postgresql sequence是什么?
    在PostgreSQL中,序列(Sequence)是一种特殊的数据库对象,用于生成唯一的整数序列。序列可以在需要连续的、唯一的标识符时使用,例如为表中的每行分配一个唯一的ID。要创建一个序列,可以使用以下语法:CREATESEQUENCEsequence_name;其中,sequence_name是你为序列指定的名称。你还可以......
  • 为什么 springboot 项目中 使用 lombok 不需要指定版本
    springboot默认管理了lombok的版本依赖,所以不需要指定版本号SpringBoot项目中使用Lombok不需要显式指定Lombok的版本,是因为SpringBoot的父项目(spring-boot-starter-parent)已经为您管理了Lombok的版本。这是通过在SpringBoot的父项目中的dependencyManagement部分指定Lombok的......
  • UN 38.3S是什么?电池UN 38.3出口海运/航空运输包装要求指南(及相关新规内容)
    生产出口电池/锂电池货物的企业,必须申请商检机构进行包装容器的使用鉴定。使用未经鉴定合格的包装容器的电池/锂电池货物,不准出口。电池海运/航空运输要求1、电池须通过UN38.3测试要求,及1.2米的跌落包装试验2、外包装均须贴9类标签,标注UN编号3、坚固的外包装,电池应被保护以防止短......
  • 玉米表型数据,KL,ERN,KT,CC,MRDV,SCMV分别代表什么
    KL:KernelLength(粒子长度)-这通常指的是玉米粒的长度,是玉米品质和产量方面的重要性状之一。ERN:EarNumber(穗数)-这可能表示每株玉米植株上的穗数,也是产量和生长特性的一项重要指标。KT:KernelThickness(粒子厚度)-这可能指的是玉米粒的厚度或宽度,也与品质和产量相关。......
  • Vue的数组操作方法和JavaScript原生数组方法有什么区别?
    Vue的数组操作方法和JavaScript原生数组方法之间存在一些区别,主要体现在对响应式更新的处理上。#####1:响应式更新:Vue数组操作方法是对JavaScript原生数组方法的封装,能够触发Vue的响应式更新机制。这意味着当你使用Vue的数组操作方法修改数组时,Vue会自动检测到数组的变化......
  • 什么是网络存储服务器
    网络存储器就像一台只有存储功能的终端,独立地工作,里面带有固定的系统,但可以自己设置部分参数功能,可以接入服务器或者电脑进行设置,网络存储服务器实际上就是精简的、小型化的服务器,同样由主板、CPU(Soc,芯片级系统、内存、网络芯片等组成•虽然它是从服务器的基础上简化而来,但功能依......
  • 视频监控汇聚平台EasyNVR安防视频内核启动正常,但视频无法播放是什么原因?
    EasyNVR是基于RTSP/Onvif协议的安防视频云服务平台,可实现设备接入、实时直播、录像、检索与回放、云存储、视频分发、级联等视频能力服务,可覆盖全终端平台(电脑、手机、平板等终端),在智慧工厂、智慧工地、智慧社区、智慧校园等场景中有大量落地应用。 近期有用户向我们求助,EasyNV......
  • Oracle为什么写阻塞读导致Buffer Busy Waits
     Oracle为什么写阻塞读导致BufferBusyWaits 这之前需要了解在内存中定位并读取一个buffer的流程,先看看为什么读不阻塞写。 读不阻塞写:假设会话s1在读取dbbuffercache中读取需要的buffer过程中,会获取CBCLatch后查找定位buffer后,以共享S模式获取BH(BufferHeader)的Buff......