初級読了 2 分

DynamoDB のデータ型

DynamoDB のすべての属性は、ワイヤ形式で1文字か2文字の型コードが付けられます。 この型は値の格納方法とアイテムサイズへの数え方の両方を左右するため、 どんな型があるかを知っておくことが重要です。

DynamoDB はどんなデータ型をサポートしていますか?

DynamoDB は3つのカテゴリにわたる10種類のデータ型をサポートしています。スカラーは String(S)、Number(N)、Binary(B)、Boolean(BOOL)、Null(NULL)です。ドキュメントは Map(M)と List(L)で、他の型をネストします。セットは String Set(SS)、Number Set(NS)、Binary Set(BS)で、順序なし・同種・空でない、という性質を持ちます。キーにできるのは SNB のみです。

コードカテゴリJSON / JS 相当例(DynamoDB-JSON)
SStringスカラーstring{"S": "Ada"}
NNumberスカラーnumber{"N": "37"}
BBinaryスカラーUint8Array / base64{"B": "ZGF0YQ=="}
BOOLBooleanスカラーboolean{"BOOL": true}
NULLNullスカラーnull{"NULL": true}
MMapドキュメントobject{"M": {"k": {"S": "v"}}}
LListドキュメントarray{"L": [{"N": "1"}]}
SSString setセット—(JSON 型なし){"SS": ["a", "b"]}
NSNumber setセット{"NS": ["1", "2"]}
BSBinary setセット{"BS": ["ZA=="]}

スカラー

  • S — 文字列(UTF-8。文字数ではなくバイト長でサイズが決まる)。
  • N — 数値。精度を保つため文字列として送られ、最大38桁。
  • B — バイナリ。base64 エンコードで送られる。
  • BOOLtrue / false
  • NULL — 明示的な null マーカー。

ドキュメント

  • M — マップ(オブジェクト)。ネストされた各属性は自身の型タグを保持する。
  • L — リスト。要素は型が混在してもよい。
{"profile": {"M": {"name": {"S": "Ada"}, "age": {"N": "37"}}}}

セット

  • SS — 文字列セット、NS — 数値セット、BS — バイナリセット。

セットは順序なし・同種で、空にはできません。重要なのは、素の JSON にはセット型が存在しないことです。配列はリスト(L)としてラウンドトリップし、SS/NS にはなりません。これはバグではなく実際の変換上の制限です。 DynamoDB-JSON コンバーター の注記を参照してください。

どの型をキーにできますか?

キーとキーは、テーブル上でも任意のインデックス上でも、スカラーでなければならず、しかも SNB のいずれかに限られます。boolean、set、map、list をキーにはできません。値を1つの S に連結して「複合」キーをモデル化してください(例: ORDER#2026#42)。

知っておくべき制限

  • 1つのアイテムの上限は 400 KB です。ネストされたものも含め、すべての属性名と値が対象です。
  • 数値は最大38桁の精度を持ちます(正・負のいずれも)。
  • マップとリストは32レベルまで深くネストできます。
  • セットは空でなく同種です。空のセットも、SN の混在もできません。

なぜ型がコストに影響するのか

アイテムサイズは属性名のバイト数と値のバイト数の合計で、各型のサイズの数え方は異なります。数値は圧縮され、boolean と null は1バイト、マップとリストは要素ごとのオーバーヘッドが加わります。そのサイズが読み取り/書き込みの キャパシティユニットに切り上げられます。 アイテムサイズ計算機で実際のアイテムを計測してください。

DynoTable でやってみる

上で述べたセットとリストの区別は、ツールがたいてい隠してしまうものです。DynoTable のアイテムエディターは、フォーマット切り替えでこれを明示します。

  • 素の JSON — プリミティブは素のまま("age": 30)ですが、セットは型ラッパーを保持してラウンドトリップに耐えます: "tags": { "SS": ["a", "b"] }"scores": { "NS": ["1.5", "2.5"] }。これは日常的な編集向けの読みやすい形式です。
  • DynamoDB JSON — AWS 標準の形式で、すべての 値が型タグを持ちます: "age": { "N": "30" }"name": { "S": "alice" }

両者を切り替えると、各スカラー・ドキュメント・セット型がワイヤ上でどう表現されるかが正確に分かります。そしてセット型には素の JSON 相当がないため、この切り替えは、アイテム全体を手作業でマーシャリングせずに SS/NS/BS を手で書き起こす唯一の方法でもあります。

DynoTable's item editor showing an item with a number set and a string set, and the Plain-JSON / DynamoDB-JSON toggle.
DynoTable's item editor showing an item with a number set and a string set, and the Plain-JSON / DynamoDB-JSON toggle.

DynoTable を試すと、アイテムを編集しながら各属性の型とライブのバイト数を確認でき、さらに各型タグを読み取ってくれる SQL Workbench で型付き属性をまたいでフィルタや集計ができます。アプリなしでマーシャリング済みのブロブを変換するには、DynamoDB-JSON コンバーターがブラウザ内で同じラウンドトリップを行います。

更新日