我接触过的大多数/所有基于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(或其他)查询施加顺序。这样做的理由是在缩放和计算复杂性是重要的考虑因素的环境中。
答案 0 :(得分:1)
好问题。
这绝不是一个全面的答案,只是我对这个奇怪问题的看法。
通常,数据库返回一系列行,大多数文档将其称为“结果集”。
数据库
现在,该结果集在执行查询时被组装,并且可以采用不同的形式。数据库最有可能将其作为“枚举”发送:这是一个类似列表的实体,当您请求行时会生成行。为了节省资源,数据库将尝试不立即实现整个结果集,而是在从客户端应用程序读取行时生成行。嗯,只要查询可以被“流水线化”,就会发生这种情况。
当查询无法通过管道传递时,则将实现整个数据集(在数据库端)。
驾驶员
您的客户端驱动程序不会一一检索行,而是通过使用缓冲将它们分组。即使无法通过管道传递查询,您的客户端驱动程序也会根据“提取大小”和“缓冲区大小”以组的形式检索行。
客户端技术
您的应用程序可以使用基本的驱动程序原始操作,也可以使用更复杂的ORM。通常,ORM将隐藏驱动程序的所有内部工作,并为您提供“简单”的结果,例如数组,列表或映射,即隐藏枚举提供的“流”。
如果您不使用ORM,则可能会自己调用驱动程序原语,因此可以访问所有内部丑陋的细节。好处是您可以在您喜欢的任何数据结构中组合结果集行。
在任何情况下,数据结构都取决于特定的查询,因为“映射”或“集合”将需要唯一标识符之王,而列表则不需要。