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

时间:2018-08-07 14:54:41

标签: sql node.js rdbms knex.js

我接触过的大多数/所有基于SQL的RDBMS连接器库都将以数组形式返回结果。为什么?如果顺序是任意的(没有排序SQL修饰符),那么自然数据返回的形式是否可以像Set或Hashmap这样?在某些情况下,这些数据结构在规模上将比典型的数组/列表返回(如C ++(具有标准模板库用法),JavaScript / Node,Go以及支持关联数据类型或纯集。

特别是,诸如knex.js之类的库是否以连接标志的形式提供了这样的功能(我尚未找到)?

任何主要的RDBMS系统(MySQL,PostgreSQL等)是否都可以以set / hashmap形式返回结果?

具体来说,我认为使用node.js和诸如knex.js之类的库会有意义,那就是指定一个标志,例如:

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

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

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

这样做的理由是在缩放和计算复杂性是重要的考虑因素的环境中。

1 个答案:

答案 0 :(得分:1)

好问题。

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

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

数据库

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

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

驾驶员

您的客户端驱动程序不会一一检索行,而是通过使用缓冲将它们分组。即使无法通过管道传递查询,您的客户端驱动程序也会根据“提取大小”和“缓冲区大小”以组的形式检索行。

客户端技术

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

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

在任何情况下,数据结构都取决于特定的查询,因为“映射”或“集合”将需要唯一标识符之王,而列表则不需要。