0Pricing
AWS Solutions Architect · 课时

表、项目与主键

使用分区键和复合主键设计 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-read

UpdateItem 与条件表达式

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 表、项目与主键
  2. 预置容量与按需容量
  3. 全局二级索引与本地二级索引
  4. DynamoDB Streams 与全局表
← 返回 AWS Solutions Architect