DynamoDB vs Amazon S3

DynamoDB 和 Amazon S3 解决的是不同的问题,所以对"该用哪个"这个问题,诚实的答案通常是两个都用。DynamoDB 是一个键值和文档数据库,用于你按键查找、查询和更新的结构化记录。Amazon S3 是对象存储,用于文件和二进制大对象——图片、备份、日志、视频——你将它们整体存储和取回。它们是互补的,而不是二选一。

我该用 DynamoDB 还是 S3?

当你有许多小型结构化记录,需要按键以个位数毫秒级延迟查询、过滤和更新时,使用 DynamoDB。当你存储和提供整个文件或二进制大对象——图片、备份、导出——并按名称取回它们时,使用 Amazon S3。它们是互补的:一个非常常见的模式是把对象存在 S3、把它的元数据存在 DynamoDB。

DynamoDB vs Amazon S3 速览

特性DynamoDBAmazon S3
主要用途用于结构化记录的 NoSQL 键值 / 文档数据库用于文件、二进制大对象和非结构化数据的对象存储
数据单元项目(一组带类型的属性),由主键寻址对象(字节 + 元数据),由桶内的键寻址
每单元最大大小每个项目 400 KB(属性名 + 值)每个对象 5 TB(单次 PUT 最多 5 GB;更大的上传使用分段上传)
查询 / 访问GetItemQueryScanBatchGetItem、PartiQL、二级索引(GSI/LSI)按键 GET / PUT / DELETELIST 一个桶;通过 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"模式的 GetItemQueryUpdate 或条件表达式时,免费的 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。

相关内容

Last verified 2026-07-12 against official AWS DynamoDB and Amazon S3 documentation. Amazon S3、DynamoDB 和 Athena 是 Amazon Web Services 的服务;此处引用仅用于标识目的。

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。