RDBMS 结果 return、排序和 returning sets/hashmaps 而不是 arrays/lists

RDBMS results return, ordering and returning sets/hashmaps instead of arrays/lists

我接触过的基于

Most/allSQL的RDBMS连接器库会return以数组形式产生结果。为什么?如果顺序是任意的(没有排序 SQL 修饰符),那么自然数据 return 可以采用 Set 或 Hashmap 之类的形式吗?在某些情况下,这些数据结构在计算规模上比 C++(使用标准模板库)、JavaScript/Node、Go 和任何语言中的典型 array/list return 更有利其他支持关联数据类型或纯集合的语言。

特别是 knex.js 等库是否以连接标志的形式提供这种功能(我还没有找到)?

是否有任何主要的 RDBMS 系统(MySQL、PostgreSQL、...)提供 return 形式 set/hashmap 结果的能力?

具体来说,我认为使用 node.js 和像 knex.js 这样的库有意义的是指定一个标志,如:

knex.forceMap('keycolumnpattern') 或者,knex.forceSet()...

同样,这里的基本假设是您没有通过添加排序指令(即 ORDER BY

)对 SQL(或其他)查​​询施加顺序

这样做的理由是在扩展和计算复杂性是重要问题的环境中。

好问题。

这绝不是一个全面的答案,只是我对这个奇怪问题的看法。

通常数据库 return 一系列行,大多数文档将其称为 "result set"。

数据库

现在,此结果集在执行查询时为 assembled,并且可能采用不同的形式。数据库很可能将其作为 "enumeration" 发送:这是一个 list-like 实体,在您请求它们时生成行。为了节省资源,数据库将尽量不立即具体化整个结果集,而是在您从客户端应用程序读取它们时生成行。好吧,只要查询可以 "pipelined",就会发生这种情况。

当无法对查询进行流水线处理时,将具体化整个数据集(在数据库端)。

driver

您的客户端 driver 不会逐行检索行,而是通过使用缓冲成组检索行。即使无法对查询进行流水线处理,您的客户端 driver 也会根据 "fetch size" 和 "buffer size".

分组检索行

客户端技术

您的应用程序可以使用基本的 driver 原始操作,或更复杂的 ORM。 ORM 通常会隐藏 driver 的所有内部工作,并会为您提供 "simple" 结果,如数组、列表或映射,即隐藏枚举提供的 "streaming"。

如果您不使用 ORM,那么您可能会自己调用 driver 原语,因此您可以访问所有内部丑陋的细节。好处是您可以 assemble 您喜欢的任何数据结构中的结果集行。

无论如何,数据结构的全部内容将取决于特定的查询,因为 "map" 或 "set" 将需要一些唯一标识符之王,而列表则不需要。