入门阅读约 1 分钟

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字符串 SetSet—(无对应 JSON 类型){"SS": ["a", "b"]}
NS数字 SetSet{"NS": ["1", "2"]}
BS二进制 SetSet{"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 转换器的说明。

哪些类型可以做键?

分区键和排序键 —— 无论在表上还是在任意索引上 —— 都必须是标量,且只能是 SNB。你不能用布尔值、Set、映射或列表做键。可以通过把多个值拼接进一个 S 来建模一个“复合”键(例如 ORDER#2026#42)。

值得了解的限制

  • 一个项最大为 400 KB —— 包含每个属性名加上值,连同嵌套的部分。
  • 数字最多携带 38 位精度(正数或负数)。
  • 映射和列表最多嵌套 32 层深。
  • Set 非空且同构 —— 没有空 Set,也不能混用 SN

为什么类型会影响成本

项大小是属性名字节加上值字节的总和,而每种类型的计算方式各不相同 —— 数字被压缩,布尔值和空值各占 1 字节,映射和列表会增加每个元素的开销。该大小会向上取整为读/写容量单元。用项大小计算器来测量一个真实的项。

试用 DynoTable,在你编辑一个项时即可看到每个属性的类型和实时字节数 —— 还能在 SQL Workbench 中跨带类型的属性进行筛选或聚合,它会替你读取每个类型标记。

更新于