DynamoDB 数据类型
每个 DynamoDB 属性在线路格式中都带有一个一到两个字母的类型代码。了解这套类型很重要,因为类型既决定了值如何存储,也决定了它如何计入一个项的大小。
DynamoDB 支持哪些数据类型?
DynamoDB 支持三大类共十种数据类型。标量是字符串(S)、数字(N)、二进制(B)、布尔(BOOL)和空值(NULL)。文档是映射(M)和列表(L),它们可以嵌套其他类型。集合是字符串集合(SS)、数字集合(NS)和二进制集合(BS)——无序、同质且非空。只有 S、N 和 B 能作为键。
| 代码 | 类型 | 类别 | 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 | 字符串集合 | 集合 | —(无 JSON 类型) | {"SS": ["a", "b"]} |
NS | 数字集合 | 集合 | — | {"NS": ["1", "2"]} |
BS | 二进制集合 | 集合 | — | {"BS": ["ZA=="]} |
标量
S—— 字符串(UTF-8;按其字节长度计算大小,而非字符数)。N—— 数字,为保证精度以字符串形式发送;最多 38 位。B—— 二进制,以 base64 编码发送。BOOL——true/false。NULL—— 一个显式的空值标记。
文档
M—— 映射(对象)。每个嵌套属性都保留自己的类型标记。L—— 列表。元素可以是混合类型。
{"profile": {"M": {"name": {"S": "Ada"}, "age": {"N": "37"}}}}集合
SS—— 字符串集合,NS—— 数字集合,BS—— 二进制集合。
集合是无序、同质的,且不能为空。关键在于,普通 JSON 没有集合类型——数组来回转换时会变成列表(L),而绝不会是 SS/NS。这是一个真实的转换限制,而非 bug;参见 DynamoDB-JSON 转换器的说明。
哪些类型能作为键?
键和键——无论是在表上还是在任意索引上——都必须是标量,而且只能是 S、N 或 B。你不能用布尔、集合、映射或列表作键。要构造一个"复合"键,可以把多个值拼接成一个 S(例如 ORDER#2026#42)。
值得了解的限制
- 一个项最大为 400 KB——包含每个属性名加值,嵌套的也算在内。
- 数字精度最多 38 位(正负均可)。
- 映射和列表最多可嵌套 32 层深。
- 集合非空且同质——不能有空集合,也不能混用
S和N。
为什么类型会影响成本
项大小是属性名字节加值字节的总和,而每种类型的大小计算方式各不相同——数字被压缩,布尔和空值各占 1 字节,映射和列表则会增加每个元素的开销。这个大小会向上取整为读/写容量单元。用项大小计算器测量一个真实的项。
在 DynoTable 中操作
上面讲到的集合与列表之别,正是工具通常会隐藏起来的东西。DynoTable 的项编辑器用一个格式切换开关把它显式化:
- 普通 JSON —— 基本类型保持朴素(
"age": 30),但集合会保留其类型包装器,以便在来回转换中存活下来:"tags": { "SS": ["a", "b"] }、"scores": { "NS": ["1.5", "2.5"] }。这是日常编辑时更易读的形式。 - DynamoDB JSON —— 规范的 AWS 形式,其中每一个值都带着自己的类型标记:
"age": { "N": "30" }、"name": { "S": "alice" }。
在两者之间切换,能让你确切看到每种标量、文档和集合类型在线路上是如何表示的——而且因为集合类型没有普通 JSON 的等价物,这个切换开关是你唯一能手工编写 SS/NS/BS 而不必手动 marshal 整个项的途径。

试用 DynoTable,在编辑一个项时查看每个属性的类型以及实时的字节数——并在 SQL 工作台中对带类型的属性进行筛选或聚合,它会替你读取每个类型标记。若不想用应用就转换一个 marshalled 数据块,DynamoDB-JSON 转换器会在浏览器中完成同样的来回转换。


