Sql RDBMS结果返回、排序和返回集合/哈希映射,而不是数组/列表

Sql RDBMS结果返回、排序和返回集合/哈希映射,而不是数组/列表,sql,node.js,rdbms,knex.js,Sql,Node.js,Rdbms,Knex.js,我接触过的大多数/所有基于SQL的RDBMS连接器库都将以数组形式返回结果。为什么?如果顺序是任意的(没有排序SQL修饰符),那么自然返回的数据是否可以是Set或Hashmap之类的形式?在某些情况下,这些数据结构在规模上比典型的数组/列表返回(如C++(标准模板库使用)、JavaScript /节点、GO和支持关联数据类型或纯集合的任何其他语言)更具有计算量。 特别是,像knex.js这样的库是否以连接标志的形式提供了这样的功能(我还没有找到它) 是否有任何主要的RDBMS系统(MySQL、P

我接触过的大多数/所有基于SQL的RDBMS连接器库都将以数组形式返回结果。为什么?如果顺序是任意的(没有排序SQL修饰符),那么自然返回的数据是否可以是Set或Hashmap之类的形式?在某些情况下,这些数据结构在规模上比典型的数组/列表返回(如C++(标准模板库使用)、JavaScript /节点、GO和支持关联数据类型或纯集合的任何其他语言)更具有计算量。 特别是,像knex.js这样的库是否以连接标志的形式提供了这样的功能(我还没有找到它)

是否有任何主要的RDBMS系统(MySQL、PostgreSQL等)能够以set/hashmap形式返回结果

具体地说,我认为使用node.js和knex.js这样的库是有意义的,可以指定如下标志:

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

同样,这里的基本假设是,您没有通过添加排序指令(即ORDERBY)来对SQL(或其他)查询施加顺序

这一点的理由是在环境中,扩展和计算复杂性是重要的关注点

好问题

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

通常数据库返回一系列行,大多数文档称之为“结果集”

数据库

现在,这个结果集在执行查询时被组装起来,可以采用不同的形式。数据库很可能以“枚举”的形式发送:这是一个类似列表的实体,当您请求行时,它会生成行。为了节省资源,数据库将尝试不立即具体化整个结果集,而是在您从客户端应用程序读取行时生成行。好的,只要查询可以“管道化”,就会发生这种情况

当查询无法通过管道传输时,整个数据集(在数据库端)将被实现

司机

客户端驱动程序不会逐个检索行,而是通过使用缓冲将行分组检索。即使查询无法管道化,客户机驱动程序也会根据“获取大小”和“缓冲区大小”分组检索行

客户端技术

您的应用程序可以使用基本的驱动程序原语操作或更复杂的ORM。通常,ORMs会隐藏驱动程序的所有内部工作,并向您提供“简单”的结果,如数组、列表或映射,即隐藏枚举提供的“流”

如果您不使用ORM,那么您可能会自己调用驱动程序原语,因此您可以访问所有内部丑陋的细节。这样做的好处是,您可以将结果集行组合到您喜欢的任何数据结构中


在任何情况下,数据结构都将取决于特定的查询,因为“地图”或“集合”需要某种唯一标识符,而列表则不需要。这是一个奇怪的问题。可以通过hashmaps进行迭代。如果查询的排序依据为
,则结果是有序的。而且,列表和数组通常占用更少的空间。RDBMS对于如何将结果传递给您选择的语言几乎没有发言权。这取决于库/驱动程序。你应该用你想用的语言来标记你的问题。例如,PHP的mysqli和PDO库允许将结果加载到关联数组中(类似于hashmap)?PK不是一个选项,因为它并不总是存在。此外,根据所使用的SQL,您最终将处理结果的两种不同表示形式(除非您希望使用ORDER BY值(可能是复合值)作为键)。在大多数环境中,排序的Hashmaps是最近才出现的,甚至不存在于任何地方。此外,数组是集合的通用表示形式,其中所有元素都是隐式唯一的,因此它自然适合SQL查询的结果。我试图用它来标记这个问题,但stackoverflow限制为5:(.该键可以默认为PK,或者默认为指定为原始查询一部分的键(我们谈论的是查询生成器,因此根据定义…)。重点不是利用hashmap中的任何排序,这是原始问题的重点,即如果退货订单不重要,则只返回与订单无关的数据类型。我已编辑了我的问题,以解决被搁置的问题。感谢您的回复,这有助于向我澄清我的问题,我已收到您的回复在我的问题被搁置后,我更新了它。