如果一条 SQL 语句返回一个数据库,会怎样?

一种新的 SQL 扩展提议让查询返回一整组相关表——本质上是一个小型、归一化的“子数据库”——而不是单个反范式化结果表。支持者认为它对 ORM、层级数据、性能(减少传输中的重复数据)以及保留模式/键的信息都有好处,并将其类比为 GraphQL、Datomic 和范畴论数据库等思路。批评者则认为现有工具(连接、多次查询、JSON/JSONB、存储过程)已经覆盖了大多数用例,而且围绕“数据库”与“模式”的新术语和附加复杂性未必值得成为一种新的语言特性。

概念:“SELECT RESULTDB” / 返回类似数据库的结果

  • 提议:扩展 SQL,使查询可以返回多个相关表(一个“数据库的子集”),而不是单个反范式化的结果集。
  • 可以把它理解为一种“归一化连接”:你会得到涉及的每个表分别对应的关系,只包含相关行,并保留键/关系。
  • 其目标是减少连接中的数据重复,并在结果中保留更多模式/键的信息。

动机与用例

  • 性能:避免在大型连接结果中重复父表数据;尤其在父子/雪花模式中,可减少传输的数据量。
  • ORM:更容易还原对象图(例如食谱和配料、订单和客户),而不必使用 N+1 查询或生成巨大反范式化连接。
  • 延迟:一次往返即可获取多个相关关系,而不是发起很多查询。
  • 一致性:单个查询可以提供相关数据的快照,而多次查询可能得到不一致的数据。
  • 可能适合边缘数据库 / 本地镜像:获取一个“部分数据库”,用于离线或客户端侧查询。

批评与质疑

  • 许多人认为现有工具已经足够:多次查询(可并行)、JSON/数组聚合、返回多个结果集的视图/存储过程、游标。
  • 有人把反范式化的查询结果视为一种 特性:查询的职责是把数据塑造成所需格式,而不是镜像模式。
  • 担心在内存中构造一个“结果数据库”只是把复杂性转移到客户端,客户端随后还得再次对其查询。
  • 一些人认为论文误解或曲解了关系模型,或者把“关系型”与 SQL 的局限混为一谈。
  • 还有人认为这只是对打包/拆包多个关系的语法糖。

相关技术与前例

  • 与 GraphQL、JSON:API、SQL JSON/JSONB 支持、SQL Server 的 FOR JSON、ODBC/MARS 多结果集、Akiban 的“嵌套结果集”作比较。
  • 也提到范畴论中的“查询作为数据库之间的态射”,以及图/Datalog 系统和类似 Datomic 的“数据库即值”理念。

未决问题与歧义

  • 线程中讨论了键、外键和聚合(例如 SUM、MAX)在多表结果中的精确语义,但尚未完全定论。
  • 这种方法相较于压缩和现有模式能带来多大实际收益,仍有争议,也尚不清楚。