表、项目和属性
以下是基本的 DynamoDB 组件:
-
表 – 类似于其他数据库系统,DynamoDB 将数据存储在表中。表 是数据的集合。例如,请参阅名为 People 的示例表,该表可用于存储有关好友、家人或关注的任何其他人的个人联系信息。您也可以建立一个 Cars 表,存储有关人们所驾驶的车辆的信息。
-
项目 – 每个表包含零个或更多个项目。项目 是一组属性,具有不同于所有其他项目的唯一标识。在 People 表中,每个项目表示一位人员。在 Cars 表中,每个项目代表一种车。DynamoDB 中的项目在很多方面都类似于其他数据库系统中的行、记录或元组。在 DynamoDB 中,对表中可存储的项目数没有限制。
-
属性 – 每个项目包含一个或多个属性。属性 是基础的数据元素,无需进一步分解。例如,People 表中的一个项目包含名为 PersonID、LastName、FirstName 等的属性。对于 Department 表,项目可能包含 DepartmentID、Name、Manager等属性。DynamoDB 中的属性在很多方面都类似于其他数据库系统中的字段或列。
-
主键
创建表时,除表名称外,您还必须指定表的主键。主键唯一标识表中的每个项目,因此,任意两个项目的主键都不相同。
DynamoDB 支持两种不同类型的主键:
-
分区键 – 由一个名为 partition key 的属性构成的简单主键。
DynamoDB 使用分区键的值作为内部散列函数的输入。来自散列函数的输出决定了项目将存储到的分区 (DynamoDB 内部的物理存储)。
在只有分区键的表中,任何两个项目都不能有相同的分区键值。
表、项目和属性 中所述的 People 表是带简单主键 (PersonID) 的示例表。您可以直接访问 People 表中的任何项目,方法是提供该项目的 PersonId 值。
-
分区键和排序键 – 称为复合主键,此类型的键由两个属性组成。第一个属性是分区键,第二个属性是排序键。
DynamoDB 使用分区键值作为对内部散列函数的输入。来自散列函数的输出决定了项目将存储到的分区 (DynamoDB 内部的物理存储)。具有相同分区键值的所有项目按排序键值的排序顺序存储在一起。
在具有分区键和排序键的表中,两个项目可能具有相同的分区键值。但是,这两个项目必须具有不同的排序键值。
表、项目和属性中所述的 Music 表是包含一个复合主键(Artist 和 SongTitle)的表的示例。您可以直接访问 Music 表中的任何项目,方法是提供该项目的 Artist 和 SongTitle 值。
在查询数据时,复合主键可让您获得额外的灵活性。例如,如果您仅提供了 Artist 的值,则 DynamoDB 将检索该艺术家的所有歌曲。要仅检索特定艺术家的一部分歌曲,您可以提供一个 Artist 值和一系列 SongTitle 值。
二级索引
您可以在一个表上创建一个或多个二级索引。利用二级索引,除了可对主键进行查询外,还可使用替代键查询表中的数据。DynamoDB 不需要您使用索引,但它们将为您的应用程序提供数据查询方面的更大的灵活性。在表中创建二级索引后,您可以从索引中读取数据,方法与从表中读取数据大体相同。
DynamoDB 支持两种索引:
-
Global secondary index – 一种带有可能与表中不同的分区键和排序键的索引。
-
本地二级索引 – 分区键与表中的相同但排序键与表中的不同的索引。
DynamoDB 中的每个表具有 20 个全局二级索引(默认限制)和 5 个本地二级索引的限制。
DynamoDB 流
DynamoDB 流 是一项可选功能,用于捕获 DynamoDB 表中的数据修改事件。有关这些事件的数据将以事件发生的顺序近乎实时地出现在流中。
每个事件由一条流记录 表示。如果您对表启用流,则每当以下事件之一发生时,DynamoDB 流 都会写入一条流记录:
-
向表中添加了新项目:流将捕获整个项目的映像,包括其所有属性。
-
更新了项目:流将捕获项目中已修改的任何属性的“之前”和“之后”映像。
-
从表中删除了项目:流将在整个项目被删除前捕获其映像。
每条流记录还包含表的名称、事件时间戳和其他元数据。流记录具有 24 个小时的生命周期;在此时间过后,它们将从流中自动删除。
您可以将 DynamoDB 流 与 AWS Lambda 结合使用以创建触发器 — 在流中有您感兴趣的事件出现时自动执行的代码。例如,假设有一个包含某公司客户信息的 Customers 表。假设您希望向每位新客户发送一封“欢迎”电子邮件。您可对该表启用一个流,然后将该流与 Lambda 函数关联。Lambda 函数将在新的流记录出现时执行,但只会处理添加到 Customers 表的新项目。对于具有
EmailAddress
属性的任何项目,Lambda 函数将调用 Amazon Simple Email Service (Amazon SES) 以向该地址发送电子邮件。注意
在此示例中,最后一位客户 Craig Roe 将不会收到电子邮件,因为他没有
EmailAddress
。除了触发器之外,DynamoDB 流 还提供了强大的解决方案,例如,AWS 区域内和跨 AWS 区域的数据复制、DynamoDB 表中的数据具体化视图、使用 Kinesis 具体化视图的数据分析等。
读/写容量模式和吞吐量
您可以每 24 小时在读/写容量模式之间切换一次。
容量单位大小(对于预置表)
一个读取容量单位 = 对大小为 4 KB 的项目每秒执行一次强一致性读取,或每秒执行两次最终一致性读取。
一个写入容量单位 = 对大小为 1 KB 的项目每秒执行一次写入。
事务读取请求需要 2 个读取容量单位才能对大小最多为 4 KB 的项目每秒执行一次读取。
事务写入请求需要 2 个写入容量单位才能对大小最多为 1 KB 的项目每秒执行一次写入。
请求单位大小(对于按需表)
一个读取请求单位 = 对大小最多为 4 KB 的项目执行一次强一致性读取,或执行两次最终一致性读取。
一个写入请求单位 = 对大小最多为 1 KB 的项目执行一次写入。
事务读取请求需要 2 个读取请求单位才能对大小最多为 4 KB 的项目执行一次读取。
事务写入请求需要 2 个写入请求单位才能对大小最多为 1 KB 的项目执行一次写入。
表
表大小
表的大小没有实际限制。表的项目数和字节数是无限制的。
每个账户中表的数量
对于任何 AWS 账户,每个 AWS 区域的初始限制为 256 个表。
数据类型
字符串
字符串的长度会受到 400 KB 这一项目大小上限的限制。
字符串是使用 UTF-8 二进制编码的 Unicode。由于 UTF-8 是宽度可变的编码,因此 DynamoDB 使用其 UTF-8 字节确定字符串的长度。
数字
数字最多可精确到 38 位,并且可以为正数、负数或零。
-
正数范围:
1E-130
到9.9999999999999999999999999999999999999E 125
-
负数范围:
-9.9999999999999999999999999999999999999E 125
到-1E-130
DynamoDB 使用 JSON 字符串代表请求和回复中的数字数据。有关更多信息,请参阅DynamoDB 低级 API。
如果数字精度十分重要,则应使用从数字类型转换的字符串将数字传递给 DynamoDB。
二进制
二进制的长度会受到项目大小上限 (400 KB) 的限制。
使用二进制属性的应用程序必须先用 Base64 格式对数据进行编码,然后将其发送至 DynamoDB。接收到数据后,DynamoDB 将数据解码为无符号字节数组,将其用作属性的长度。
项目
项目大小
DynamoDB 中的项目大小上限为 400 KB,包括属性名称二进制长度(UTF-8 长度)和属性值长度(同为二进制长度)。属性名称也包含在此大小限制之内。
例如,比如一个项目有两个属性:一个属性名为“shirt-color”,值为“R”,另一个属性名为“shirt-size”,值为“M”。该项目的总大小为 23 字节。
具有本地二级索引的表的项目大小
对于表上的每个local secondary index,以下对象的总大小有 400 KB 的限制:
-
表中项目数据的大小。
-
与该项目对应的local secondary index条目的大小,包括其键值和投影属性。
属性
每个项目的属性“名称/值”对
每个项目的属性的累计大小必须在 DynamoDB 项目大小上限 (400 KB) 以内。
列表、映射或集中值的数量
只要包含值的项目大小在 400 KB 这一大小限制以内,列表、映射或集中值的数量就没有限制。
属性值
属性值不能是空字符串或空集(字符串集、数字集或二进制集),但可以是空列表和映射。
嵌套属性深度
DynamoDB 支持高达 32 级深度的嵌套属性。
-