什么是GraphQL?
寻求在服务器上使用后端数据库的方法的前端开发人员一直在支持GraphQL,因为它具有强大而简单的格式来表达复杂的请求。尽管通常认为GraphQL与用于存储诸如社交网络之类的关系的图数据库密切相关,但是它已经超出了这种联系。它的简化语法使其成为从表中获取所有数据的流行方法。
考虑下面的示例:一页只需要一个用户列表。另一个必须只包括有宠物狗的使用者。三分之一的人希望用户与他们的地址匹配并按邮政编码排序,但仅适用于美国地址。
当查询必须使用多层且有时互连的数据结构时,GraphQL简化了我们提出问题以产生正确答案的方式。
SQL和转向GraphQL
传统数据库基于称为SQL的语言,是结构化查询语言的缩写。简单的请求很容易用SQL编写,但是当表格数据结构过多时会出现问题。导航复杂的请求很困难,并且应用程序的数据充满了埋在节和小节中的嵌套字段。试图找到一个好的查询以准确地找到匹配的正确子集需要深入的思考,实验和迭代。开发人员花费时间思考匹配和合并表(称为JOINS)的复杂操作链,而不是在应用程序上工作。
GraphQL是用于向数据库提出查询的简化机制。它使用现代语法构建,因此使用Web浏览器和使用JavaScript的服务器堆栈(如Node.js)的开发人员会很熟悉。该请求列出了所有需要的字段,并为特定字段添加了限制以进行匹配或搜索。列表的格式很稀疏,与带有大括号的字段相呼应的是流行的JSON数据结构格式。
许多数据库管理员之所以喜欢GraphQL,是因为它节省了开发人员的时间,并且可以鼓励他们编写更精确的查询,这些查询仅返回基本数据,从而节省了带宽。
GraphQL最初是由Facebook为一个内部项目创建的,该公司开始共享它,以期建立一个通用标准。它已成功完成,现在许多用户都依赖它来执行与初始任务几乎没有相似之处的请求。
最早的版本可以追溯到2012年,但是Facebook直到2015年才发布语言描述和规范。当其他公司开始使用查询语言时,Facebook在2018年剥离了一个独立的基金会。具有API访问Facebook数据中心的外部客户端必须使用GraphQL进行搜索。
查询语言也与开发Node.js应用程序的有时称为Jamstack风格紧密结合。一些主要的库,例如Gatsby,使用GraphQL作为其通用语言,从数据库中提取信息。采取这种开发风格的程序员自然会选择该语言。
对用户有什么帮助?
GraphQL用户经常对它的简单性以及如何编写复杂的查询(这些查询遍历由许多连接构建的复杂数据结构)给予高度评价。如果数据足够简单以适合一个表,那么切换到GraphQL通常不会有太多好处,但是如果数据包含多个表,那么它就可以发光。
在来自航空旅行世界的示例中,时间表可以充满航班,并且每个航班都可以载满乘客。每个乘客还具有自己的身体特征,例如身高或体重,以及喜好和医疗需求。使用GraphQL只需几句话,即可找到需要特大号轮椅的乘客的所有航班清单。
查询语言欢迎诸如变量之类的编程结构。结果看起来更像JavaScript代码,这使得采用起来更加容易。
该语言有时还与图形数据库混淆,图形数据库是一种旨在简化存储和搜索链接元素的网络的工具。GraphQL在指定这些复杂图形的查询时效果很好,特别是当必须通过搜索节点或数据元素的多个层来找到结果时尤其如此。但是,该语言还可以与传统的表格或以文档为中心的数据库一起很好地工作。换句话说,使用GraphQL不需要图。
一些传统的开发人员发现GraphQL在隐藏检索过程的复杂性方面有点太好了。一些数据库分析人员喜欢使用清晰的JOIN语句来制作SQL查询,因为这迫使他们想象如何连接不同的表。JOIN可能是回答查询中最耗时的部分,明确地写出它们会迫使分析人员考虑时间与空间之间的权衡。了解查询的结构还可以使数据库创建者提前计划,以通过添加索引来加快某些查询的速度。
传统参与者如何处理GraphQL
传统数据库使用SQL,但它们通过添加额外的软件层(将GraphQL转换为传统SQL语句)来拥抱GraphQL。JSON中的结果通常由本地JSON例程格式化,该例程已成为主要数据库的一部分。
一家新兴公司Hasura发行了一个开源软件包,该软件包将为PostgreSQL数据库转换GraphQL。它紧密集成,并与PostgreSQL的许多特定功能配合使用,例如对GIS和地理编码的支持。该公司还为那些想要为服务而不是软件产品付费的人运行完全托管的云API。
Hasura还致力于将其界面与Microsoft的SQL Server集成。Hasura和微软之间的这一联合项目预计将于2021年初开始。
其他工具也提供相同种类的胶水。例如,JoinMonster可与从Oracle到SQLite的所有主要SQL数据库以及MySQL的多个版本一起使用。它与Node.js集成,并使用数据库模式来计划一组传统的SQL查询,这些查询将获取正确数量的数据。
Oracle还通过添加外部GraphQL解析器来扩展访问范围,这些解析器生成可找到数据的PL / SQL。Oracle数据库已经包含了用于格式化JSON格式答案的标准功能。
DGraph称自己为“唯一具有图形后端的本机GraphQL数据库”。这是一个开放源代码工具,旨在在提供全面的事务控制以防止不一致的同时进行水平扩展。该代码是在Apache许可和DGraph社区许可的混合下发布的。
FaunaDB是NoSQL数据库,最初使用其自己的称为FQL的关系样式查询语言。它的开发人员还为遵循该标准的用户添加了GraphQL API。
Apollo还提供了GraphQL服务器,该服务器不仅可以在本地存储数据,还可以与其他服务一起收集所有数据以获取答案。它可以充当通往联合服务器群的网关,从而简化了前端开发人员的界面。该工具的体系结构鼓励开发人员称之为“关注点分离”,将工作分解为单独的服务和数据存储。这鼓励使用更具弹性的数据源,因为其中一个故障可能不会影响另一个。
Amazon Web Services(AWS)还采用GraphQL来支持许多API。将扩增出的框架,例如,在很大程度上依赖于语言来处理获取数据的工作。其他应用程序也可以使用AppSync服务将GraphQL API添加到AWS数据源,例如DynamoDB 。
GraphQL有什么不能做的?
如果数据库模式很简单,并且查询将从一个表中提取所有信息,则SQL或GraphQL查询的复杂度没有太大差异。SQL数据库的传统响应格式有时也比JSON更有效。在这些情况下,选择一个并没有明显的好处。现代开发人员可能更喜欢GraphQL的语法,但这很大程度上取决于口味。
当架构包含许多规范化表并且查询跨越其中的多个表时,GraphQL会亮起来。选择字段并包括过滤值更易于理解,因为开发人员无需考虑JOIN。
完整的GraphQL规范还包括许多选项,可采用更多编程方式进行查询,例如添加变量和定义函数。这些可以建立甚至更复杂的策略,以仅检索正确的数据并减小响应的大小。但是,复杂的功能可能会使某些开发人员不知所措,并且需要精心的调试和试验。一些搜索复杂网络的查询可能令人生畏。
第一时间获取面向IT决策者的独家深度资讯,敬请关注IT经理网微信号:ctociocom
除非注明,本站文章均为原创或编译,未经许可严禁转载。
相关文章: