入門閱讀時間 2 分鐘

DynamoDB 資料型別

在線路格式中,每個 DynamoDB 屬性都會標上一到兩個字母的型別代碼。認識這整組型別很重要,因為型別同時決定了值的儲存方式,以及它如何計入項目大小。

DynamoDB 支援哪些資料型別?

DynamoDB 支援分屬三大類的十種資料型別。純量是 String(S)、Number(N)、Binary(B)、Boolean(BOOL)與 Null(NULL)。文件是 Map(M)與 List(L),可巢狀嵌入其他型別。集合是 String Set(SS)、Number Set(NS)與 Binary Set(BS) — 無序、同質且非空。只有 SNB 可以當作鍵。

代碼型別類別JSON / JS 對應範例(DynamoDB-JSON)
SString純量string{"S": "Ada"}
NNumber純量number{"N": "37"}
BBinary純量Uint8Array / base64{"B": "ZGF0YQ=="}
BOOLBoolean純量boolean{"BOOL": true}
NULLNull純量null{"NULL": true}
MMap文件object{"M": {"k": {"S": "v"}}}
LList文件array{"L": [{"N": "1"}]}
SSString set集合—(無 JSON 型別){"SS": ["a", "b"]}
NSNumber set集合{"NS": ["1", "2"]}
BSBinary set集合{"BS": ["ZA=="]}

純量

  • S — 字串(UTF-8;以其位元組長度計算大小,而非字元數)。
  • N — 數字,為了精度而以字串傳送;最多 38 位數。
  • B — 二進位,以 base64 編碼傳送。
  • BOOLtrue / false
  • NULL — 一個明確的 null 標記。

文件

  • M — map(物件)。巢狀屬性各自保留自己的型別標記。
  • L — list。元素可以是混合型別。
{"profile": {"M": {"name": {"S": "Ada"}, "age": {"N": "37"}}}}

集合

  • SS — string set、NS — number set、BS — binary set。

集合是無序、同質的,而且不能為空。關鍵在於,純 JSON 沒有集合型別 — 一個陣列往返轉換後會變成 list(L),永遠不會是 SSNS。這是一個真正的轉換限制,而非 bug;請參見 DynamoDB-JSON 轉換器的說明。

哪些型別可以當鍵?

— 無論在表格上或任何索引上 — 都必須是純量,而且只能是 SNB。你不能用 boolean、set、map 或 list 當鍵。要建模「複合」鍵,可以把多個值串接成一個 S(例如 ORDER#2026#42)。

值得知道的限制

  • 一個項目的上限是 400 KB — 包含每個屬性名稱加上值,巢狀的也算在內。
  • 數字帶有最多 38 位數的精度(正負皆然)。
  • Map 與 list 最多可巢狀 32 層深。
  • 集合是非空且同質的 — 沒有空集合,也不能混用 SN

為什麼型別會影響成本

項目大小是屬性名稱位元組加上值位元組的總和,而每種型別的計算方式都不同 — 數字會被壓縮、boolean 與 null 各佔 1 位元組、map 與 list 則增加每元素的負擔。該大小會向上進位成讀取/寫入容量單位。用項目大小計算機測量一個真實項目。

在 DynoTable 中實作

上面提到的集合與 list 的區別,正是工具通常會隱藏起來的東西。DynoTable 的項目編輯器用一個格式切換讓它變得明確:

  • 純 JSON — 基本型別保持樸素("age": 30),但集合會保留它們的型別外殼,以便安然通過往返轉換:"tags": { "SS": ["a", "b"] }"scores": { "NS": ["1.5", "2.5"] }。這是日常編輯時最易讀的形式。
  • DynamoDB JSON — 標準的 AWS 形式,其中每一個值都帶著它的型別標記:"age": { "N": "30" }"name": { "S": "alice" }

在兩者之間切換,能讓你確切看到每種純量、文件與集合型別在線路上是如何表示的 — 而且因為集合型別沒有純 JSON 的對應,這個切換是唯一能讓你手動撰寫 SSNSBS、而不必手動 marshal 整個項目的方式。

DynoTable 的項目編輯器,顯示一個含有 number set 與 string set 的項目,以及純 JSON/DynamoDB-JSON 切換。
DynoTable 的項目編輯器,顯示一個含有 number set 與 string set 的項目,以及純 JSON/DynamoDB-JSON 切換。

試用 DynoTable,即可在編輯項目時看到每個屬性的型別與即時的位元組計數 — 並在 SQL Workbench 中跨越各種帶型別的屬性進行 filter 或聚合,它會替你讀取每個型別標記。若不使用 App 而想轉換一個 marshalled 的資料塊,DynamoDB-JSON 轉換器可在瀏覽器中做同樣的往返轉換。

已更新