DynamoDB のデータ型
すべての DynamoDB の属性には、ワイヤー形式で1文字または2文字の型コードのタグが 付きます。この一覧を知ることが重要なのは、型が値の保存方法と、その値がアイテムの サイズにどう寄与するかの両方を決めるからです。
ひと目で
| コード | 型 | カテゴリ | JSON / JS 相当 | 例(DynamoDB-JSON) |
|---|---|---|---|---|
S | 文字列 | スカラー | string | {"S": "Ada"} |
N | 数値 | スカラー | number | {"N": "37"} |
B | バイナリ | スカラー | Uint8Array / base64 | {"B": "ZGF0YQ=="} |
BOOL | ブール値 | スカラー | boolean | {"BOOL": true} |
NULL | Null | スカラー | null | {"NULL": true} |
M | マップ | ドキュメント | object | {"M": {"k": {"S": "v"}}} |
L | リスト | ドキュメント | array | {"L": [{"N": "1"}]} |
SS | 文字列セット | セット | —(JSON 型なし) | {"SS": ["a", "b"]} |
NS | 数値セット | セット | — | {"NS": ["1", "2"]} |
BS | バイナリセット | セット | — | {"BS": ["ZA=="]} |
スカラー
S— 文字列(UTF-8。文字数ではなく バイト 長でサイズ計算されます)。N— 数値。精度のため文字列として送られ、最大38桁です。B— バイナリ。base64 エンコードされて送られます。BOOL—true/false。NULL— 明示的な null マーカー。
ドキュメント
M— マップ(オブジェクト)。ネストされた属性はそれぞれ独自の型タグを保持します。L— リスト。要素は型が混在しても構いません。
{"profile": {"M": {"name": {"S": "Ada"}, "age": {"N": "37"}}}}セット
SS— 文字列セット、NS— 数値セット、BS— バイナリセット。
セットは順序を持たず、同種で、空にはできません。重要なのは、プレーンな JSON には
セット型がない ことです — 配列はリスト (L) としてラウンドトリップし、決して
SS/NS にはなりません。これはバグではなく実際の変換上の制約です。
DynamoDB-JSON コンバーター の注記を参照してください。
どの型をキーにできるか
パーティションキーとソートキーは — テーブルでも任意のインデックスでも — スカラー
でなければならず、S、N、B のいずれかだけです。ブール値、セット、マップ、リスト
をキーにすることはできません。複数の値を1つの S に連結して「複合」キーをモデル化
してください(例: ORDER#2026#42)。
知っておくと役立つ制限
- アイテムは 400 KB が上限です — すべての属性名と値、ネストされたものも含みます。
- 数値は最大 38桁 の精度を持ちます(正でも負でも)。
- マップとリストは最大 32レベル までネストできます。
- セットは空にできず同種です — 空のセットも、
SとNの混在もできません。
なぜ型がコストに影響するか
アイテムサイズは属性名のバイト数と値のバイト数の合計で、各型はサイズ計算が 異なります — 数値は圧縮され、ブール値と null は1バイト、マップとリストは要素ごとの オーバーヘッドを加えます。そのサイズは読み取り/書き込みの キャパシティユニット に切り上げられます。実際のアイテムを アイテムサイズ計算ツール で測ってください。
DynoTable を試す と、アイテムを編集しながらすべての属性の型と リアルタイムのバイト数を確認でき、各型タグを読み取る SQL Workbench で型付き属性を 横断してフィルタや集計ができます。