8种用于数据查询的新语言

263 阅读9分钟

超越SQL:8种用于数据查询的新语言

几十年来,SQL一直主导着数据查询。新的查询语言为现代用例提供了更多的优雅性、简单性和灵活性。

在过去三十年中,数据库和结构化查询语言(SQL)几乎是同义词。任何想从数据库中检索信息的人都必须学习SQL。任何想照顾数据库或从事数据库管理员工作的人都需要掌握其细微差别。

这种语言本身就是一种回归,是一种像大型机用户那样思考和编码的机会。当世界上其他地方接受小写字母时,SQL用户继续输入SELECT或WHERE这样的词。即使在今天,似乎也很少有人关心一些Tik Tok用户对他们的嘲笑,或者问他们为什么要喊叫。如果说ALL CAPS对于打卡机上穿着领带和短袖衬衫的人来说已经足够好了,那么,对于今天穿着泰迪熊睡衣的远程工作者来说,它仍然足够好。

但是,SQL在数据检索方面的地位正在下滑。新的数据库正在出现,而且有些数据库使用的是全新的语言。这并不是说SQL正变得不那么流行。如果有的话,现在编写的SQL比以前更多。只是,数据存储的世界正在以更快的速度爆炸,而其中一些增长正在刺激人们进行实验和分支的冲动。

本文介绍了八种较新的检索数据的方法。在某些情况下,这些创新只是表面现象。开发人员已经更新了SQL的语法,使其更加整洁和容易阅读,因此在为浏览器编写代码和检索数据之间转换齿轮时就不会那么刺耳了。这些工具的创造者强调,底层结构与SQL基本上是一样的。它仍然会很容易学习。不要担心。

其他工具邀请我们以完全不同的方式思考。以图形或时间序列存储其位的数据库为程序员如何指定他们想要寻找的东西提供了新的范式。

对于你需要做的事情,并不是所有这些选项都会比SQL更好。并非所有的选项都能捕捉到你所寻求的可能性。但所有这些都提供了一个机会,让你以不同的方式思考服务器上的字节海,只是等待你找到一种方法来表达你的需求。

GraphQL

GraphQL的名字有点令人困惑,因为它并不是一种旨在利用图形数据库的所有可能性的语言。它更像是一种优雅的速记,用于查询以类似于JSON的嵌套格式存储的数据。查询只是快速描述结果应该是什么样子。后端查看这个字段列表,其中可能有对值的限制,并试图找到匹配的结果。在SQL规定数据库应如何完成一个请求的地方,GraphQL用户只是提供一个字段列表。有些人称其为 "实例查询"。

这种语言是一些JSON数据库的自然匹配,但GraphQL在搜索具有表格模式的关系数据库方面也越来越受欢迎。智能后端可以将嵌套请求翻译成适合模式的JOIN模式。

最初的语言是作为Facebook的一个内部项目开始的,但在它作为一个独立的开源项目被发布后,其他人开始开发GraphQL后端。现在已经有了用所有主要语言和许多现代实验性语言编写的版本。

PRQL

如果你自然而然地认为软件是一个管道或一种汇编语言,那么你可能会喜欢PRQL,它代表管道式关系查询语言(发音为 "Prequel")。这种语言的查询结构为一连串的小命令。这些命令合在一起,产生的结果就是你想要的数据。

与许多现代编程语言类似,查询的心理模型采取了功能化的方法。像变量这样的简单功能减少了重复,简化了流程。一行的结果在一个长链中被送入下一行。如果你想去掉一个步骤,你通常可以直接注释掉那一行,其余的流水线仍然可以工作。

PRQL的代码是用Rust编写的,作为将PRQL转换为SQL的转译器。基本结构是可扩展的,所以你可以添加更多的抽象,以适应你的使用情况。这种实验的便利性确保了该语言将迅速发展。

WebAssembly

许多开发者认为WebAssembly(缩写为Wasm)是一种创建在网络浏览器中运行的快速应用程序的工具。当Redpanda开始建立一个数据流工具来取代Kafka时,他们希望增加一种机制,不仅可以传递数据,而且偶尔也可以在途中对其进行转换。WebAssembly是他们的选择。

Redpanda通过创建一个不可改变和有序的数据流,充当了一个账本。事件被添加,程序员可以在过去的任何时间点进入数据流。大多数人将从新创建的事件开始,但有些人可能从过去开始,创建历史性的聚合。

当然,WebAssembly比一些数据库中的存储程序更有能力,也更低级。并非所有的开发者都想写比特级的代码。但是,这个选项打开了数据流的精心改造,远远超出了SQL所能做到的。

GQL

图形查询语言,或GQL,是一个拟议的标准,它合并了类似的声明性语言,如Cypher,PGQL,和GSQL。开发人员通过指定一组节点的特定模型来创建查询,然后由数据库负责寻找匹配。GQL适用于更复杂的属性图,允许成对的节点共享几个不同的连接。

该标准正在积极开发中。目前,最好的实现是研究工具,并不打算长期部署。

Gremlin

作为搜索图的原始语言之一,Gremlin要求通过节点之间的连接来搜索一组步骤。有些人称它为 "基于路径 "或 "图形遍历 "的语言。每个查询都是建立在步骤之上的,每个步骤都可以涉及到对当前节点的映射,过滤一个列表,或者以某种方式将结果列表。

这种语言往往只是一个起点。例如,有些人通过在Gremlin中嵌入Python解释器来扩展Gremlin,这样查询就可以包括Python代码。还有一些人将Gremlin嵌入到标准的编程语言中,如Java,这样程序员就可以从该语言中获取Gremlin的力量。

Gremlin最早是为Apache的TinkerPop项目建立的,它已经被亚马逊的Neptune等主要交易型图形数据库和使用Apache Spark或Hadoop的图形处理框架所采用。

N1QL

多年来,Couchbase一直在寻找查询一般文档的最佳方式。一开始,查询被写成一个JavaScript函数,交给数据库来执行。这是一个很好的、通用的解决方案,有时要花很长时间才能生成一个结果,但它要求程序员有一点不同的思维。

N1QL(发音为 "nickel")的设计是为了让SQL原生用户更容易处理可能存储在Couchbase中的JSON对象。一个基本的查询有几个部分,由关键词SELECT、FROM和WHERE指定,就像SQL一样。指定进入数据结构的路径的细节将被调整并适应于JSON对象的嵌套世界。

为了鼓励实验,N1QL提供了一个具有可视化界面的查询工作台来测试和完善查询。Couchbase还提供了一个通用的全文搜索选项,对于寻求文本词而不是结构化数据的查询,它可以独立运行。

Malloy

Malloy的创造者认为,SQL的问题在于句法细节。即使是最简单的查询也需要时间,因为这种语言很冗长,而且充满了隐藏的性能陷阱。因此,他们创造了一种现代编程语言,具有自然的默认值和更简单的语法,可以编译成SQL,所以没有人需要改造库存数据库。

其结果是一种类似于更强大的GraphQL的语法。一个查询更像是一个结果的模型或愿景,包括任何限制、匹配或默认值。Malloy在后台处理一些优化。例如,可以自动生成更聪明的JOIN,以避免chasm和fan性能陷阱。子查询可以被聚集起来以节省时间。指数也会根据需要添加。因此,写查询的感觉更像是在写现代代码,标点符号的作用是保持结构的简洁。

Malloy的开源核心是用TypeScript构建的,包括在Node.js代码中。一个VS Code插件简化了开发。

Basis

大多数查询语言都是直接与特定的数据库联系在一起的。Basis正在建立更多的管道,在用SQL和Python的混合物过滤它们之前,可以从各种来源中提取。在管道的末端是出口商,将数据交付给各种标准选项,范围包括运行代码、AI算法、图表和仪表盘。

开发人员已经在自己的代码中建立了这样的管道,许多项目都依赖于类似的结构。Basis提供了一个预构建的选项,可以以更精细的方式进行定制。输入的范围从标准的数据库查询到API接入到定制的Python代码。变换器并不局限于SQL的基本WHERE子句,因为你可以编写Python代码,在数据流向管道时做更多过滤。

Basis只是较新的数据管道工具的一个例子,这些工具开放了查询过程,以便从一个以上的来源获取数据,用一种以上的语言进行过滤,并以一种以上的形式交付数据。这是一个能够从几乎任何来源获取数据并将其交付给几乎任何消费者的愿景。