DynamoDB 支持 JOIN 吗?

数据库本身不支持。作为一个非关系型数据库,DynamoDB 没有 JOIN 操作,而 PartiQL 也没有补上一个,所以对于生产读取路径,你要改为对关联数据建模:做反范式化(复制或内嵌数据,让每个访问模式都是一次查询),或者用单表设计把相关项目并置在同一个分区键下。但你依然可以从客户端对你的 DynamoDB 表跑一次真正的连接:DynoTable 的 SQL Workbench 能在你的实时数据上执行真正的 JOINGROUP BY 和聚合查询。

数据库为什么没有连接

DynamoDB 的设计目标是在任意规模下提供可预测的、个位数毫秒的读取。在读取时做连接会让延迟取决于关联数据有多少,那就破坏了这个保证。所以对于你建模过的访问模式,连接是在写入时由你自己完成的。

如果你硬要试会怎样

PartiQL 在解析器里就拒绝了这条语句,什么都还没读。显式连接和逗号交叉连接以同样的方式失败:

SELECT o."total", c."name" FROM "Orders" o JOIN "Customers" c ON o."pk" = c."id"
SELECT * FROM "Orders", "Customers"
ValidationException: Only select from a single table or index is supported.
HTTP 400

所以并不存在什么「慢但能跑」的兜底方案等你在生产里发现。一条点名两张表的语句就是语法错误,而这份工作必须挪到别处:挪进你的数据模型,或者挪进一个自己完成关系型那部分的客户端。

对建模过的访问模式你该怎么做

  • 反范式化——把你会一起读取的关联数据复制或内嵌进来。
  • 单表设计——在一张表里用重载的键存放多种实体类型,这样一个项目集合就能在一次 Query 里把它们读出来。
  • 邻接列表——把多对多关系建模成可以按键 Query 的项目。

这些能让生产读取保持为单次请求。完整的走查见 DynamoDB 连接

用 DynoTable 跑一次真正的 JOIN

对于那些你_没有_预先建模的临时跨表问题——比如横跨一张 Orders 表和一张 Customers 表的「上个月哪些欧盟客户花了 500 美元以上?」——DynoTable 会替你跑这次连接。它是一款桌面 DynamoDB 客户端,其 SQL Workbench 能执行真正的 JOINGROUP BY 和聚合查询:它通过普通的 DynamoDB API 读取项目,然后在客户端运行查询里关系型的那一部分。所以下面这条是能跑的,哪怕这些表之间没有定义任何关系,哪怕查询引擎里根本没有 JOIN 关键字:

SELECT   c.name, SUM(o.total) AS spend
FROM     Customers c
JOIN     Orders o ON o.customerId = c.id
WHERE    c.region = 'EU'
GROUP BY c.name

不想写 SQL?Smart Tables 是同一个连接引擎的可视化通道:在画布上于两张表之间画一条关系线,然后浏览连接后的数据行。

那句诚实的保留意见,「在 DynamoDB 的访问模式规则内」是这样的:Workbench 依然要通过 DynamoDB 读取,所以最快的连接是那些 ON 属性或 WHERE 子句至少在一侧命中分区键或 GSI 的连接,这样 DynamoDB 才能跑 Query 而不是全表扫描。Workbench 的行为见 /docs/dynamodb-sql-workbench,可视化连接画布见 /docs/smart-tables。DynoTable 让你能把连接这个问题_问出来_,而不必在代码里手工缝合结果;它并没有废除上面那些约束。在各家 DynamoDB GUI 客户端里,它是唯一一个「是的,你可以连接」当真成立的:PartiQL 和 AWS 自家的 NoSQL Workbench 都止步于单表这堵墙。

对于完全避免连接的单表读取,请在 single-table design tool 建模前相关数据的非规范化副本。

这笔取舍

对于生产读取路径,你在写入侧多做一些细致的工作,好让读取既便宜又是常数时间。

深入了解

读一读 DynamoDB 连接单表设计DynamoDB 中的一对多关系下载 DynoTable 在你的表上跑一次真正的 JOIN,用 SQL 或者用 Smart Tables 可视化地跑。

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

上方的 ValidationException 于 2026-07-28 针对 DynamoDB Local 3.3.0 通过 @aws-sdk/client-dynamodb 3.1095.0 复现,为原样引用。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。