DynamoDB vs Amazon S3
DynamoDB 和 Amazon S3 解决的是不同的问题,所以对"该用哪个"这个问题,诚实的答案通常是两个都用。DynamoDB 是一个键值和文档数据库,用于你按键查找、查询和更新的结构化记录。Amazon S3 是对象存储,用于文件和二进制大对象——图片、备份、日志、视频——你将它们整体存储和取回。它们是互补的,而不是二选一。
我该用 DynamoDB 还是 S3?
当你有许多小型结构化记录,需要按键以个位数毫秒级延迟查询、过滤和更新时,使用 DynamoDB。当你存储和提供整个文件或二进制大对象——图片、备份、导出——并按名称取回它们时,使用 Amazon S3。它们是互补的:一个非常常见的模式是把对象存在 S3、把它的元数据存在 DynamoDB。
DynamoDB vs Amazon S3 速览
| 特性 | DynamoDB | Amazon S3 |
|---|---|---|
| 主要用途 | 用于结构化记录的 NoSQL 键值 / 文档数据库 | 用于文件、二进制大对象和非结构化数据的对象存储 |
| 数据单元 | 项目(一组带类型的属性),由主键寻址 | 对象(字节 + 元数据),由桶内的键寻址 |
| 每单元最大大小 | 每个项目 400 KB(属性名 + 值) | 每个对象 5 TB(单次 PUT 最多 5 GB;更大的上传使用分段上传) |
| 查询 / 访问 | GetItem、Query、Scan、BatchGetItem、PartiQL、二级索引(GSI/LSI) | 按键 GET / PUT / DELETE,LIST 一个桶;通过 Amazon Athena 就地查询(或对现有客户提供 S3 Select) |
| 延迟特征 | 任意规模下对单个项目个位数毫秒级读写 | 持久化对象吞吐量;每请求延迟高于键值数据库,不是毫秒级的记录查找 |
| 一致性 | 默认最终一致性;可按请求获取强一致性读取 | 对所有对象和所有请求提供强的写后读一致性(自 2020 年起) |
| 定价模型 | 读/写容量(RCU/WCU——按需或预置)+ 按 GB-月的数据存储 | 按 GB-月的存储(按存储类别)+ 请求费用(PUT/GET/LIST)+ 数据检索 / 传输 |
| 最适合的工作负载 | 用户资料、会话、购物车、事件/状态记录、元数据、高吞吐量 OLTP 式访问 | 媒体、备份、数据湖文件、静态资产、大型导出、归档 |
上表中的每一格都取自 AWS 官方文档(见本文件顶部的来源说明)。
何时使用 DynamoDB
当你的数据是你按键访问的结构化记录时,选择 DynamoDB:
- 许多你单独读、写和更新的小型项目(每个都在 400 KB 限制以下)。
- 可预测的低延迟查找——DynamoDB 面向任意规模下对单个项目的个位数毫秒级读写。
- 可以用主键和二级索引表达的访问模式:按 id 获取、查询一个分区、在分区内过滤。
- 高写入吞吐量配合细粒度更新(改一个属性而不必重写整条记录)。
如果你发现自己想把一个 5 MB 的文件存进一个项目里,那就是你已经触及 DynamoDB 边界的信号——见 DynamoDB 项目大小限制。
何时使用 S3
当你的数据是你按名称取回的整个文件或二进制大对象时,选择 Amazon S3:
- 图片、PDF、视频、音频以及其他二进制资产。
- 备份、数据库导出以及稍后用 Amazon Athena 等工具查询的数据湖文件(Parquet、CSV、JSON)。
- 大型对象——S3 存储的对象每个最大 5 TB,远超任何单条数据库记录。
- 静态网站资产以及直接提供给用户的内容。
S3 不是数据库:你无法像查询 DynamoDB 项目那样用丰富的索引查询任意对象的内容。对一个对象做就地的 SQL 式过滤可通过 Amazon Athena 实现(S3 Select 仍对现有客户可用,但在 2024 年已对新客户关闭)。
搭配使用
这两个服务结合起来最强大。对于超出单个 DynamoDB 项目大小的数据,AWS 自己的指导是把对象存在 S3、在 DynamoDB 里保留一个指针:
- 把大文件(图片、文档、视频)作为对象存在 S3 中。
- 把它的元数据——S3 对象键、内容类型、所有者、标签、时间戳——作为一个项目存在 DynamoDB 中,在那里它可以廉价地被查询。
- 按键在 DynamoDB 中查到记录,然后用存储的标识符从 S3 取回对象。
AWS 指出的一个注意点:不存在跨 DynamoDB 和 S3 的事务,所以你的应用需要处理部分失败(例如,在 DynamoDB 写入失败时清理孤立的 S3 对象)。
使用 DynamoDB
一旦你为数据中结构化的那一半选择了 DynamoDB,DynoTable 是一个桌面 DynamoDB 客户端,可在 macOS、Windows 和 Linux 上浏览、编辑和查询表。它读取你标准的 AWS 凭证链,所以没有什么 DynamoDB 特有的东西需要迁移——把它指向你的区域和表,你的数据就留在 DynamoDB 中。
当你需要手工构建支撑上述"元数据存 DynamoDB"模式的 GetItem、Query、Update 或条件表达式时,免费的 DynamoDB Expression Builder 会以 AWS SDK、CLI 和 boto3 形式生成请求。要在决定什么该放进 S3 之前,对照 400 KB 限制衡量一个项目,项目大小计算器 会测量一条记录的字节大小。
FAQ
DynamoDB 能存文件或图片吗?
小的可以,但有限制。一个 DynamoDB 项目可以保存二进制数据,但整个项目——每个属性名和值——必须保持在 400 KB 以下。对于任何更大的东西,AWS 记载的最佳实践是把文件作为对象存在 Amazon S3 中,并在 DynamoDB 项目里保留 S3 对象键(加元数据)。
S3 比 DynamoDB 便宜吗?
它们定价方式不同,所以取决于工作负载而不是一个笼统的答案。S3 按 GB-月收取存储费用,加上每请求和检索费用,对于大量不常访问的字节,它通常是更便宜的归宿。DynamoDB 按读/写容量加存储收费,是为对许多小型记录的高吞吐量、低延迟访问而构建的。把大型二进制大对象存进 DynamoDB 既受大小限制又相对昂贵——这正是"S3 存对象 + DynamoDB 存元数据"拆分成为标准模式的原因。
JSON 该用 DynamoDB 还是 S3?
如果这个 JSON 是一条你按键查询和更新的结构化记录——一个用户、一个订单、一个会话——那 DynamoDB 合适,它会把 JSON 映射为带类型的属性并支持 PartiQL。如果这个 JSON 是一个你存储、之后批量扫描的整个文档或数据湖文件(例如用 Amazon Athena 查询它),那 S3 合适。一个常见的混合方案是把可查询的字段留在 DynamoDB,而把完整的 JSON 载荷作为对象存在 S3。
相关内容
- 了解:DynamoDB 项目大小限制 · 何时使用 DynamoDB
- 用 DynamoDB Expression Builder 可视化地构建请求。
- 用 DynamoDB 项目大小计算器 衡量记录大小。
- 下载 DynoTable 来处理你的 DynamoDB 表。
Last verified 2026-07-12 against official AWS DynamoDB and Amazon S3 documentation. Amazon S3、DynamoDB 和 Athena 是 Amazon Web Services 的服务;此处引用仅用于标识目的。