

# DynamoDB で大きな項目と属性を格納するベストプラクティス
<a name="bp-use-s3-too"></a>

Amazon DynamoDB は、テーブルに格納する各アイテムのサイズを 400 KB に制限します (「[項目のサイズ](Constraints.md#limits-items-size)」を参照)。アプリケーションで DynamoDB のサイズ制限よりも多くのデータを格納する必要がある場合は、1 つ以上の大きな属性を圧縮するか、項目を複数の項目に分割することができます (ソートキーによって効率的にインデックス付けされます)。Amazon Simple Storage Service (Amazon S3) にオブジェクトとして項目を保存して、Amazon S3 オブジェクト識別子を DynamoDB 項目に格納することもできます。

ベストプラクティスとして、400 KB の最大アイテムサイズに近づいたアイテムサイズを監視して警告するアイテムを書き込む際は、[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) パラメータを使用します。アイテムの最大サイズを超えると、書き込みが失敗します。DynamoDB は [ValidationException error](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 で長いメッセージを圧縮する方法を示すサンプルコードについては、次のトピックを参照してください。
+ [例: AWS SDK for Java ドキュメント API を使用したバイナリタイプ属性の処理](JavaDocumentAPIBinaryTypeExample.md)
+ [例: AWS SDK for .NET 低レベル 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` テーブルについて考えてみましょう。このテーブル内の項目は、価格、説明、書籍の著者、その他の製品の寸法に関する情報を格納します。大きすぎて項目に収まらない各製品のイメージを保存する場合は、DynamoDB ではなく、Amazon S3 にイメージを保存できます。

この方法を実装するときは、次の制限事項に注意してください。
+ DynamoDB は、Amazon S3 と DynamoDB 間のトランザクションをサポートしていません。このため、アプリケーションでは失敗が発生する状況に対処する必要があります。例えば、孤立した Amazon S3 オブジェクトのクリーンアップなどがあります。
+ Amazon S3 では、オブジェクト ID の長さが制限されます。そのため、過度に長いオブジェクト識別子を生成したり、他の Amazon S3 制約に違反しないようにデータを整理する必要があります。

Amazon S3 の使用方法の詳細については、[Amazon Simple Storage Service ユーザーガイド](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)を参照してください。