

# 在 DynamoDB 中存储大型项目和属性的最佳实践
<a name="bp-use-s3-too"></a>

Amazon DynamoDB 将表中存储的每个项目的大小限制为 400 KB（请参阅 [项目大小](Constraints.md#limits-items-size)）。如果应用程序需要存储的项目数据超出 DynamoDB 限制允许，可以尝试压缩一个或多个大型属性，或者将项目拆分为多个项目（按照排序键高效索引）。还可以将项目作为对象存储在 Amazon Simple Storage Service (Amazon S3) 中，然后将 Amazon S3 对象标识符存储在 DynamoDB 项目中。

作为最佳实践，在写入项目时应使用 [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/model/ReturnConsumedCapacity.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/model/ReturnConsumedCapacity.html) 参数来监控接近 400 KB 最大大小的项目并发出警报。超过最大项目大小将导致写入尝试失败。DynamoDB 将返回 [ValidationException 错误](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html)。监控项目大小并发出警报将使您能够在项目大小问题对应用程序造成影响之前缓解这些问题。

## 压缩大型属性值
<a name="bp-use-s3-too-or-compress"></a>

压缩大型属性值可以让属性值符合 DynamoDB 的项目限制，降低存储成本。压缩算法（如 GZIP 或 LZO）将产生的二进制输出可以存储在项目内的 `Binary` 属性类型中。

例如，考虑存储由论坛用户写入的消息的表。此类消息通常包含长文本字符串，可供压缩。虽然压缩可以减小项目的大小，但缺点是压缩后的属性值对筛选没有用处。

有关演示如何在 DynamoDB 中压缩此类消息的示例代码，请参见以下内容：
+ [示例：使用 适用于 Java 的 AWS SDK 文档 API 处理二进制类型属性](JavaDocumentAPIBinaryTypeExample.md)
+ [示例：使用 适用于 .NET 的 AWS SDK 低级 API 处理二进制类型属性](LowLevelDotNetBinaryTypeExample.md)

## 垂直分区
<a name="bp-use-s3-too-vertical-partitioning"></a>

处理大项目的另一种解决方案是将它们分解为较小的数据块，然后按分区键值关联所有相关项目。然后，您可以使用排序键字符串来识别与之一起存储的关联信息。通过执行此操作，按相同的分区键值对多个项目进行分组，您即创建一个[*项目集*](WorkingWithItemCollections.md)。

有关此方法的更多信息，请参阅：
+ [Use vertical partitioning to scale data efficiently in Amazon DynamoDB](https://aws.amazon.com/blogs/database/use-vertical-partitioning-to-scale-data-efficiently-in-amazon-dynamodb/) 
+ [Implement vertical partitioning in Amazon DynamoDB using AWS Glue](https://aws.amazon.com/blogs/database/implement-vertical-partitioning-in-amazon-dynamodb-using-aws-glue/) 

## 在 Amazon S3 中存储大型属性值
<a name="bp-use-s3-too-large-values"></a>

如前所述，还可以使用 Amazon S3 存储无法放入 DynamoDB 项目的大型属性值。可以将它们作为对象存储在 Amazon S3 中，然后将对象标识符存储在 DynamoDB 项目中。

还可使用 Amazon S3 的对象元数据支持，提供返回至 DynamoDB 中父项目的链接。将项目的主键值作为对象的 Amazon S3 元数据存储在 Amazon S3 中。这样做通常有助于维护 Amazon S3 对象。

例如，请考虑 `ProductCatalog` 表。此表中的项目存储商品价格、描述、书的作者以及其他产品尺寸的信息。如果要存储的每个产品的图片过大，无法放入项目，可以将图片存储在 Amazon S3 而不是 DynamoDB 中。

实施此策略时，请记住以下几点：
+ DynamoDB 不支持跨 Amazon S3 和 DynamoDB 的事务。因此，应用程序必须处理任何故障，包括清理孤立的 Amazon S3 对象。
+ Amazon S3 限制对象标识符长度。因此组织数据时必须确保，不会生成过长对象标识符或违反其他 Amazon S3 约束。

有关如何使用 Amazon S3 的更多信息，请参阅 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)。