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": true} |
M | 映射 | 文档 | object | {"M": {"k": {"S": "v"}}} |
L | 列表 | 文档 | array | {"L": [{"N": "1"}]} |
SS | 字符串 Set | Set | —(无对应 JSON 类型) | {"SS": ["a", "b"]} |
NS | 数字 Set | Set | — | {"NS": ["1", "2"]} |
BS | 二进制 Set | Set | — | {"BS": ["ZA=="]} |
标量
S—— 字符串(UTF-8;按其字节长度计算大小,而非字符数)。N—— 数字,为保证精度以字符串形式发送;最多 38 位。B—— 二进制,以 base64 编码发送。BOOL——true/false。NULL—— 一个显式的空值标记。
文档
M—— 映射(对象)。嵌套的属性各自保留自己的类型标记。L—— 列表。元素可以是混合类型。
{"profile": {"M": {"name": {"S": "Ada"}, "age": {"N": "37"}}}}Set
SS—— 字符串 Set,NS—— 数字 Set,BS—— 二进制 Set。
Set 是无序、同构的,且不能为空。关键在于,纯 JSON 没有 Set 类型 —— 数组往返转换时会变成列表(L),绝不会是 SS/NS。这是一项真实的转换限制,而非 bug;参见 DynamoDB-JSON 转换器的说明。
哪些类型可以做键?
分区键和排序键 —— 无论在表上还是在任意索引上 —— 都必须是标量,且只能是 S、N 或 B。你不能用布尔值、Set、映射或列表做键。可以通过把多个值拼接进一个 S 来建模一个“复合”键(例如 ORDER#2026#42)。
值得了解的限制
- 一个项最大为 400 KB —— 包含每个属性名加上值,连同嵌套的部分。
- 数字最多携带 38 位精度(正数或负数)。
- 映射和列表最多嵌套 32 层深。
- Set 非空且同构 —— 没有空 Set,也不能混用
S和N。
为什么类型会影响成本
项大小是属性名字节加上值字节的总和,而每种类型的计算方式各不相同 —— 数字被压缩,布尔值和空值各占 1 字节,映射和列表会增加每个元素的开销。该大小会向上取整为读/写容量单元。用项大小计算器来测量一个真实的项。
试用 DynoTable,在你编辑一个项时即可看到每个属性的类型和实时字节数 —— 还能在 SQL Workbench 中跨带类型的属性进行筛选或聚合,它会替你读取每个类型标记。