表、项目与主键
使用分区键和复合主键设计 DynamoDB 表,并了解项目级存储限制。
表、项目与主键 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。
DynamoDB:NoSQL 键值存储
Amazon DynamoDB 是一种完全托管的无服务器键值和文档数据库,专为在任意规模下实现个位数毫秒级性能而设计。与关系数据库不同,DynamoDB无模式——只要存在主键,每个项目都可以具有不同的属性集合。
DynamoDB 将数据存储在表中,表是类似于 SQL 表的顶层容器。表会自动分布在多个 AZ 中的多个存储节点上,无需您进行任何配置即可提供内置冗余。
表与项目
DynamoDB表包含一组项目,每个项目又包含一组属性。属性具有类型:字符串(S)、数字(N)、二进制(B)、布尔值(BOOL)、空值(NULL)、列表(L)、映射(M)以及集合类型(SS、NS、BS)。
表中的每个项目都必须包含主键属性;其他所有属性都是可选的,并且可以因项目而异。单个项目的大小最多为 400 KB,其中包括其所有属性名称和值。
# Example DynamoDB item structure (JSON)
{
'UserId': {'S': 'user-abc-123'},
'Timestamp': {'N': '1719000000'},
'Username': {'S': 'alice'},
'Score': {'N': '4200'},
'Tags': {'SS': ['premium', 'verified']}
}简单主键:仅使用分区键
简单主键由一个名为分区键的属性组成(也称为哈希键)。DynamoDB 会对分区键值应用内部哈希函数,以确定存储该项目的存储分区。具有相同分区键值的所有项目都会存储在一起。
使用简单主键时,表中不能有两个项目具有相同的分区键值,因此分区键可以唯一标识每个项目。这种设计适用于始终通过唯一标识符访问数据的表,例如用户 ID 或订单 ID。
# Create a table with a simple (partition key only) primary key
aws dynamodb create-table \
--table-name Users \
--attribute-definitions AttributeName=UserId,AttributeType=S \
--key-schema AttributeName=UserId,KeyType=HASH \
--billing-mode PAY_PER_REQUEST复合主键:分区键加排序键
复合主键同时使用分区键和排序键(也称为范围键)。具有相同分区键的项目会存储在一起,并按照排序键值排序,从而支持在分区内进行范围查询。
这种设计非常灵活:只要排序键不同,多个项目就可以共享同一个分区键。例如,Orders 表可以使用 CustomerId 作为分区键,使用 OrderDate 作为排序键,从而按日期排序查询某位客户的所有订单。
# Create a table with a composite primary key
aws dynamodb create-table \
--table-name Orders \
--attribute-definitions \
AttributeName=CustomerId,AttributeType=S \
AttributeName=OrderDate,AttributeType=S \
--key-schema \
AttributeName=CustomerId,KeyType=HASH \
AttributeName=OrderDate,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST分区键设计与热点分区
选择合适的分区键是 DynamoDB 最重要的设计决策。好的分区键具有高基数(大量不同的值),并能在各分区之间均匀分配访问请求。糟糕的选择会导致热点分区,使某个分区接收不成比例的流量,从而引发限流。
应避免的反模式包括:使用布尔标志(只有两个值)、使用将今天的所有写入集中在一起的日期,或使用低基数的状态字段。较好的选择包括:用户 ID、设备 ID、随机 UUID,或 tenantId#entityType 这样的复合值。
PutItem、GetItem 和 DeleteItem
DynamoDB 项目的三个基本操作是:
- PutItem:写入新项目,或完全替换具有相同主键的现有项目
- GetItem:通过项目的完整主键检索单个项目(必须提供完整主键;对于复合主键,还必须提供排序键)
- DeleteItem:通过项目的完整主键删除项目
这三个操作在项目级别都是原子的。默认情况下,GetItem 使用最终一致性读取;添加 --consistent-read 会强制执行强一致性读取,始终返回最新写入的值。
# PutItem
aws dynamodb put-item \
--table-name Users \
--item '{"UserId":{"S":"user-123"},"Name":{"S":"Alice"}}'
# GetItem
aws dynamodb get-item \
--table-name Users \
--key '{"UserId":{"S":"user-123"}}' \
--consistent-readUpdateItem 与条件表达式
UpdateItem 可以修改现有项目的特定属性,而无需完全替换项目,这一点不同于 PutItem。您可以添加或删除属性,也可以对 Number 属性执行算术运算,并且这些操作都是原子的(例如递增计数器)。
条件表达式允许您指定某个操作只有在条件为真时才成功。例如,仅当项目的状态当前为 PENDING 时才更新该状态。这种方式无需事务即可实现乐观锁定模式,是 DynamoDB 的一项关键设计技术。
# Atomically increment a counter, only if item exists
aws dynamodb update-item \
--table-name Orders \
--key '{"CustomerId":{"S":"c-123"},"OrderDate":{"S":"2026-06-20"}}' \
--update-expression 'SET ItemCount = ItemCount + :inc' \
--condition-expression 'attribute_exists(CustomerId)' \
--expression-attribute-values '{":inc":{"N":"1"}}'Query 与 Scan 的比较
Query 会检索具有相同分区键值的项目,并可选择根据排序键条件进行筛选。Query 的效率很高,因为它只读取目标分区。您可以使用 begins_with、between、=、<、> 等排序键条件,缩小分区内的结果范围。
Scan 会读取表中的每个项目,然后应用可选的筛选表达式。对于大型表,Scan 的成本很高,因此应避免在生产环境的查询模式中使用。如果您发现自己经常需要使用 Scan,请重新考虑表设计,或添加全局二级索引。
# Query: get all orders for customer c-123 after a date
aws dynamodb query \
--table-name Orders \
--key-condition-expression 'CustomerId = :cid AND OrderDate >= :dt' \
--expression-attribute-values \
'{":cid":{"S":"c-123"},":dt":{"S":"2026-01-01"}}'强一致性读取与最终一致性读取
DynamoDB 会在多个 AZ 中存储三份数据副本。最终一致性读取(默认设置)可能会返回略微过时的值,这是因为最近的写入可能尚未传播到所有副本;但它消耗的读取容量单位只有强一致性读取的一半。
强一致性读取始终返回最新的已提交写入,但成本是 RCU 的两倍,并且 Global Secondary Indexes 不支持这种读取方式。对于读取吞吐量高且以读取为主的工作负载,请选择最终一致性读取;只有在应用程序确实要求获取绝对最新的数据时,才选择强一致性读取。
DynamoDB 事务
DynamoDB 通过 TransactWriteItems 和 TransactGetItems 支持 ACID 事务。一个事务最多可以将 100 个写入操作组合在一起,这些操作可以涉及多个项目,甚至多个表,并确保所有操作要么全部成功,要么以原子方式全部回滚。
在账户之间转账(从一个项目扣款,再向另一个项目入账)或预订座位(检查可用性并以原子方式完成预留)等场景中,请使用事务。事务的 RCU/WCU 成本是正常操作的两倍,因此只有在确实需要跨多个项目保证原子性时才使用事务。
项目大小限制与数据建模技巧
DynamoDB 每个项目 400 KB 的限制会影响数据建模。对于较大的有效负载(例如图像和大型文档),请将二进制数据存储在 S3 中,只在 DynamoDB 中存储 S3 对象键。对于深度嵌套的层次结构数据,请使用单表设计,按照各节点类型分别设计分区键模式;同一个表可以存储多种实体类型,并通过分区键前缀和排序键模式加以区分。
单表设计可以减少表的数量,并通过将相关项目放置在同一分区中,实现高效的访问模式。这是一种高级技术,能够降低运维开销,并改善复杂访问模式下的性能。
快速检查
请检验您对本课 AWS Solutions Architect(SAA-C03)相关概念的理解。
课程回顾
本课您学习了:DynamoDB 表存储无架构的项目,每个项目大小限制为 400 KB;简单主键仅使用分区键,而复合键会增加排序键,以支持范围查询;以及高基数分区键可以防止分区过热。请使用 Query,而不是 Scan,以实现高效访问。接下来我们将学习预置容量模式与按需容量模式。
常见问题解答
「表、项目与主键」课时是免费的吗?
是的 — 「表、项目与主键」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。
「表、项目与主键」这节课中我会学到什么?
使用分区键和复合主键设计 DynamoDB 表,并了解项目级存储限制。 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AWS Solutions Architect 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「表、项目与主键」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AWS Solutions Architect 课中编写并运行代码吗?
能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。