DynamoDBの400KB制約は何を対象としているか?
概要
DynamoDBには項目のサイズが400KB
という制約があり、ドキュメントにも記載されています。
ただ詳細に関しての記載がなく、細かい部分の仕様が読み取りづらいです。今回は実際に制限値の境界のデータを用意して、検証してみました。
疑問
1: 400KBとは何文字?
文字コードにはUTF-8が用いられます。
その場合、原則的に、英字が1バイト、日本語は3バイトです。
(厳密には異なります。詳しくは以下の記事が参考になりそうです。)
400KBをバイト換算すると、400 * 1024 = 409,600となるため、英字換算だと409,600文字を格納できることとなります。
2: JSONの記法につかわれる記号("":{},)はカウントされるか?
カウントされません。KeyとValueの純粋な値がカウントされます。
こちらはドキュメント上でも例示されています。
たとえば、2 つの属性を持つ項目があり、1 つの属性は名前が "shirt-color" で値が "R"、別の属性は名前が "shirt-size" で値が "M" であるとします。この項目の合計サイズは 23 バイトです。
こちらの項目をJSON形式で表現すると、以下のようになります。
{"shirt-color":"R","shirt-size":"M"}
こちらを記号部分含めて、カウントすると36文字(36バイト)になり、ドキュメントの内容と一致しません。
shirt-colorRshirt-sizeM
記号部分を含めず数えると、23文字(23バイト)となり、ドキュメントの内容と一致します。
実際の検証でも、記号を含めた値が409,600文字を超えていても、データ登録ができることを確認しました。
3: フォーマットされたJSONを登録した時、空白スペースや改行コードはカウントされる?
カウントされません。フォーマットの有無を意識をする必要はありません。
4: JSON形式でのカウントと、DynamoDB JSON形式でのカウントのどちらになるか?
JSON形式でのカウントになります。
Dynamo DBのデータは、内部的には、以下の様にデータ型記述子が追加された形式にて管理されます。
// JSON
{"id": "0"}
// DynamoDB JSON
{"id": {"S": "0"}}
この場合"S"という文字列を表す値が追加されていますが、こちらはサイズ計算には影響しません。
id0
の3バイトでカウントされます。
Discussion