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" 将需要一些唯一标识符之王,而列表则不需要。
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" 将需要一些唯一标识符之王,而列表则不需要。