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 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。