入门阅读约 2 分钟

DynamoDB 数据类型

每个 DynamoDB 属性在线路格式中都带有一个一到两个字母的类型代码。了解这套类型很重要,因为类型既决定了值如何存储,也决定了它如何计入一个项的大小。

DynamoDB 支持哪些数据类型?

DynamoDB 支持三大类共十种数据类型。标量是字符串(S)、数字(N)、二进制(B)、布尔(BOOL)和空值(NULL)。文档是映射(M)和列表(L),它们可以嵌套其他类型。集合是字符串集合(SS)、数字集合(NS)和二进制集合(BS)——无序、同质且非空。只有 SNB 能作为键。

代码类型类别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 转换器的说明。

哪些类型能作为键?

键和键——无论是在表上还是在任意索引上——都必须是标量,而且只能是 SNB。你不能用布尔、集合、映射或列表作键。要构造一个"复合"键,可以把多个值拼接成一个 S(例如 ORDER#2026#42)。

值得了解的限制

  • 一个项最大为 400 KB——包含每个属性名加值,嵌套的也算在内。
  • 数字精度最多 38 位(正负均可)。
  • 映射和列表最多可嵌套 32 层深。
  • 集合非空且同质——不能有空集合,也不能混用 SN

为什么类型会影响成本

项大小是属性名字节加值字节的总和,而每种类型的大小计算方式各不相同——数字被压缩,布尔和空值各占 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 的项编辑器显示一个含有数字集合和字符串集合的项,以及普通 JSON / DynamoDB-JSON 切换开关。
DynoTable 的项编辑器显示一个含有数字集合和字符串集合的项,以及普通 JSON / DynamoDB-JSON 切换开关。

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

更新于