DynamoDB 資料類型
在線路格式中,每個 DynamoDB 屬性都會以一個一到兩個字母的類型代碼標記。了解這整套類型很重要,因為類型同時決定了值的儲存方式,以及它如何計入項目的大小。
一覽
| 代碼 | 類型 | 類別 | JSON / JS 對應 | 範例(DynamoDB-JSON) |
|---|---|---|---|---|
S | 字串 | 純量 | string | {"S": "Ada"} |
N | 數字 | 純量 | number | {"N": "37"} |
B | 二進位 | 純量 | Uint8Array / base64 | {"B": "ZGF0YQ=="} |
BOOL | 布林值 | 純量 | boolean | {"BOOL": true} |
NULL | Null | 純量 | null | {"NULL": true} |
M | 映射 | 文件 | object | {"M": {"k": {"S": "v"}}} |
L | 清單 | 文件 | array | {"L": [{"N": "1"}]} |
SS | 字串集合 | 集合 | —(無對應的 JSON 類型) | {"SS": ["a", "b"]} |
NS | 數字集合 | 集合 | — | {"NS": ["1", "2"]} |
BS | 二進位集合 | 集合 | — | {"BS": ["ZA=="]} |
純量
S— 字串(UTF-8;以其位元組長度計算大小,而非字元數)。N— 數字,為了精度而以字串傳送;最多 38 位數。B— 二進位,以 base64 編碼傳送。BOOL—true/false。NULL— 一個明確的 null 標記。
文件
M— map(物件)。巢狀屬性各自保有自己的類型標記。L— list。元素可以是混合類型。
{"profile": {"M": {"name": {"S": "Ada"}, "age": {"N": "37"}}}}集合
SS— 字串集合、NS— 數字集合、BS— 二進位集合。
集合是無序的、同質的,且不能為空。最關鍵的是,純 JSON 沒有集合類型 — 陣列來回轉換時會變成 list(L),絕不會是 SS/NS。這是真正的轉換限制,而非錯誤;請參閱 DynamoDB-JSON 轉換器的說明。
哪些類型可以當作鍵?
partition key 與 sort key — 無論在表格上或任何索引上 — 都必須是純量,而且只能是 S、N 或 B。你無法以布林、集合、map 或 list 當作鍵。請將多個值串接成一個 S 來建模「複合」鍵(例如 ORDER#2026#42)。
值得知道的限制
- 一個項目最大為 400 KB — 包含每個屬性名稱加上值,巢狀的也算在內。
- 數字最多帶有 38 位數的精度(正或負)。
- map 與 list 最多可巢狀 32 層深。
- 集合是非空且同質的 — 沒有空集合,也不能混用
S與N。
為什麼類型會影響成本
項目大小是屬性名稱位元組加上值位元組的總和,而每種類型的大小計算方式都不同 — 數字會被壓縮、布林與 null 各為 1 位元組,map 與 list 則會增加每元素的負擔。該大小會向上進位到讀取/寫入容量單位。請以項目大小計算機測量一個真實的項目。
試用 DynoTable,在你編輯項目時即可看到每個屬性的類型與即時的位元組計數 — 並能在 SQL Workbench 中跨各種有類型的屬性進行 Filter 或聚合,它會為你讀取每個類型標記。