DynamoDB FAQ — 常見問題解答
開發者最常問的 DynamoDB 問題——每個都附有清晰、坦誠的解答與後續閱讀指引。
DynamoDB 特性與能力
DynamoDB 是鍵值儲存嗎?
是——同時也是文件儲存。每個項目都透過主索引鍵定址,而屬性可以按對映和列表巢狀最多 32 層。
DynamoDB 是關聯式資料庫嗎?
不是。DynamoDB 是 NoSQL 鍵值與文件資料庫,沒有固定結構描述、外鍵或 join。你改以存取模式為中心做反正規化。
DynamoDB 符合 ACID 嗎?
符合 — DynamoDB 透過 TransactWriteItems 與 TransactGetItems 支援 ACID 交易,在每個區域內把最多 100 個動作組成一次全有全無的操作。
DynamoDB 有加密嗎?
有 — 所有 DynamoDB 資料預設都以 AWS KMS 金鑰進行靜態加密,而且無法關閉。傳輸中的資料則以 HTTPS/TLS 保護。
DynamoDB 是最終一致的嗎?
預設是 — DynamoDB 的讀取是最終一致的。你可以在資料表與 LSI 上選用強一致性讀取;GSI 則永遠是最終一致的。
DynamoDB 免費嗎?
部分免費 — DynamoDB 有一個永久免費方案:每月 25 GB 儲存空間,加上 25 個寫入與 25 個讀取容量單位。超過的用量則按請求與按 GB 計費。
DynamoDB 是記憶體資料庫嗎?
不是——DynamoDB 會把每一次寫入持久化到跨三個可用區的持久儲存上。DAX 則額外提供一層可選的記憶體快取,帶來微秒級讀取。
DynamoDB 是 NoSQL 資料庫嗎?
是——DynamoDB 是一個全託管的 NoSQL 鍵值與文件儲存,存放無模式的項目、橫向擴充套件,而它的 PartiQL 解析器會拒絕 JOIN。
DynamoDB 是開源的嗎?
不是 — DynamoDB 是專有、全受管的 AWS 服務。DynamoDB Local 是供開發使用的免費模擬器,但正式環境的引擎無法自行託管。
DynamoDB 是無模式的嗎?
是——DynamoDB 是無模式的。只有主索引鍵是在建表時定義的;其他每個屬性都是可選的,可以逐項目自由變化。
DynamoDB 是無伺服器的嗎?
是 — DynamoDB 是一個全受管、無伺服器的 NoSQL 資料庫。沒有伺服器要佈建或修補;容量會自動擴充,而你依用量付費。
DynamoDB 能儲存什麼
DynamoDB 能存 null 值嗎?
可以——DynamoDB 有專門的 NULL 型別,並且允許非鍵屬性使用空字串和空的列表/對映。但空集合會被拒絕。
DynamoDB 可以儲存陣列嗎?
可以。DynamoDB 以 List(L)型別儲存陣列,有序、可混合型別,最多巢狀 32 層。一個 400 KB 項目大約裝得下 11,070 個 UUID 字串。
DynamoDB 能儲存二進位大型物件嗎?
可以,但有限制 — DynamoDB 以 Binary 屬性(base64 編碼)儲存二進位大型物件,總量須小於 400 KB。更大的物件,AWS 建議改用 Amazon S3。
DynamoDB 可以儲存圖片嗎?
可以,但只限小張的 — DynamoDB 以 base64 的 Binary 屬性儲存圖片,且受 400 KB 項目上限約束。較大的圖片 AWS 建議放在 Amazon S3。
DynamoDB 能儲存 JSON 嗎?
可以 — DynamoDB 以它的文件型別儲存 JSON:物件用 map(M)、陣列用 list(L),最多可巢狀 32 層,並在每個項目 400 KB 的上限之內。
DynamoDB 能儲存多少資料?
DynamoDB 資料表沒有大小上限,而且會水平擴充。真正的限制是每個項目 400 KB,以及僅在有 LSI 時,每個項目集合 10 GB。
DynamoDB 的項目大小上限是多少?
400 KB,精確地說是 409,600 位元組,屬性名稱與值都算在內。DynamoDB 的項目大小上限無法調高,更大的物件請放到 S3。
DynamoDB 整合與存取
DynamoDB 能匯出到 S3 嗎?
可以 — 內建的 S3 匯出功能會把完整或增量的資料表快照寫成 DynamoDB JSON 或 Amazon Ion。它需要 PITR,而且不消耗讀取容量。
Power BI 能連線到 DynamoDB 嗎?
Power BI 沒有原生的 DynamoDB 連接器。請透過 Amazon Athena 的 ODBC 連接器或 CData 之類的驅動程式橋接,並估算每次重新整理會掃描多少資料。
可以在 AWS 之外使用 DynamoDB 嗎?
可以 — DynamoDB 透過 HTTPS 從任何地方都連得到。任何持有 AWS 憑證的應用程式,都能從筆電、伺服器或另一個雲端呼叫區域端點。
DynamoDB 有觸發器嗎?
有——DynamoDB 的觸發器是 DynamoDB Streams 加上 Lambda:Lambda 每秒輪詢 stream 四次,在每次項目更改時執行。沒有 CREATE TRIGGER 語句。
DynamoDB 支援 GraphQL 嗎?
支援,透過 AWS AppSync — 一個以 DynamoDB 資料表為資料來源的受管 GraphQL 服務,由 resolver 把 GraphQL 操作對應成 DynamoDB 呼叫。
DynamoDB 操作與查詢
DynamoDB 能自動調整規模嗎?
可以。DynamoDB 自動調整規模會在佈建容量上追蹤 20-90% 的目標使用率,但平均使用率低於 28.9% 時,隨需模式反而更便宜。
可以在本機執行 DynamoDB 嗎?
可以 — DynamoDB Local 是一個免費、可下載的 DynamoDB 版本,能透過 Docker、Java 封存檔或 Maven 在你的機器上執行,離線提供同一套 API。
DynamoDB 有備份嗎?
有 — 隨需備份提供長期快照,時間點復原(PITR)則提供連續備份,可還原到過去 35 天內的任何一秒。
DynamoDB 支援全文檢索嗎?
不支援原生的全文檢索 — DynamoDB 沒有相關性排序、詞幹處理或模糊比對。AWS 原生的答案是 zero-ETL 的 OpenSearch 整合。
DynamoDB 支援地理空間查詢嗎?
原生不支援 — DynamoDB 沒有地理資料型別,也沒有距離運算子。地理空間查找是用 geohash/S2 儲存格鍵建模,再以範圍查詢取得。
DynamoDB 支援 JOIN 嗎?
不支援——DynamoDB 沒有 JOIN,PartiQL 更是直接拒絕兩張表的 SELECT,所以你要做反正規化化。DynoTable 的 SQL Workbench 在用戶端跑真正的連線。
DynamoDB 支援 SQL 嗎?
部分支援——PartiQL 覆蓋 SELECT、INSERT、UPDATE 和 DELETE,但拒絕 JOIN、GROUP BY 和 COUNT。DynoTable 的 SQL Workbench 能在你的表上執行這些。
DynamoDB 支援交易嗎?
支援。DynamoDB 交易能把跨資料表最多 100 個動作組成一次全有全無的操作,代價是一般寫入兩倍的容量單位。
DynamoDB 支援 TTL 嗎?
支援 — DynamoDB 支援 Time to Live。設定一個以秒為單位、存放 Unix epoch 到期時間的 Number 屬性,DynamoDB 就會自動刪除過期項目,且不另計費。
DynamoDB 有多快?
很快 — DynamoDB 在任何規模下都提供一致的個位數毫秒延遲。DAX 這個記憶體內快取,能把最終一致讀取縮短到微秒等級。
DynamoDB 可以有幾張資料表?
預設每個區域 2,500 張 DynamoDB 資料表,提出申請可調高到 10,000 張。資料表沒有大小上限,但每張佈建容量的表閒置時每月仍要 0.57 美元。
在 DynamoDB 中要怎麼計算項目數?
在 Query 或 Scan 上使用 Select: COUNT,再用 LastEvaluatedKey 分頁並把 Count 加總。計數消耗的讀取容量和把項目全數回傳一樣多。
DynamoDB 架構與內部原理
DynamoDB 可以當作快取使用嗎?
可以 — DynamoDB 快速的索引鍵查找加上 TTL,讓它成為一個持久性快取。若要微秒級的讀取,就在它前面擺上 DAX,一個受管的記憶體內寫穿式快取。
DynamoDB 支援外鍵嗎?
不支援。DynamoDB 沒有外鍵、參考完整性或連鎖刪除。刪掉父項目,子項目還會留著。關聯得由你自己建模。
DynamoDB 支援 secondary index 嗎?
支援。DynamoDB 有 Global Secondary Index(自有索引鍵、最終一致、每張表預設 20 個)與 Local Secondary Index(強一致)。
DynamoDB 是多區域的嗎?
標準的 DynamoDB 資料表是單一區域。全域資料表則跨區域多主動複寫,可用性最高 99.999%,而且每個區域的儲存都要各自計費。
什麼時候不該用 DynamoDB?
分析型工作負載、未知的存取模式、大量臨機查詢,以及仰賴 join 的正規化關聯式結構,都別用 DynamoDB。