DynamoDB はスキーマレスですか?
はい。DynamoDB はスキーマレスです。テーブルを作るとき、プライマリキー以外の属性やデータ型を定義することはありません。各アイテムはそれぞれ独自の属性の組を持てて、アイテムごとに自由に変わります。ですからスキーママイグレーションを走らせずにデータモデルを適応させられます。
事前に定義するもの
プライマリキーだけです。パーティションキー(必須)と任意のソートキー、そしてそれらの型です。それ以外はすべて任意で、列を宣言することはありません。
アイテムごとに変わるもの
同じテーブルにある任意の 2 件のアイテムが、まったく異なる属性を持てます。あるアイテムは email と status を、別のアイテムは orderTotal とネストした address マップを持つ、といった具合です。DynamoDB は書き込まれたものをそのまま格納します。
スキーマレスが止まるところ
スキーマレスには正確な境界があります。プライマリキーはすべての書き込みで検証されますが、それ以外は検証されません。共通の属性を 1 つも持たない 2 件のアイテムが、文句も言われずに同じテーブルに入ります。
await client.send(
new PutItemCommand({
TableName: 'people',
Item: {pk: {S: 'USER#1'}, email: {S: 'a@b.c'}, status: {S: 'active'}}
})
);
await client.send(
new PutItemCommand({
TableName: 'people',
Item: {
pk: {S: 'ORDER#1'},
orderTotal: {N: '42.5'},
address: {M: {city: {S: 'Madrid'}}},
tags: {SS: ['a', 'b']}
}
})
);どちらも成功します。では、同じパーティションキーを文字列ではなく数値として書き込んでみましょう。
ValidationException: One or more parameter values were invalid: Type mismatch for key
HTTP 400そして pk を完全に省くと、こうなります。
ValidationException: One of the required keys was not given a value
HTTP 400この 2 つの拒否がスキーマのすべてです。キー属性は存在しなければならず、AttributeDefinitions で宣言した型と一致しなければなりません。その先はすべて、書かれたとおりに受け入れられます。
タイプミスも通ります。staus が status のつもりだったことを、書き込み時に教えてくれるものは何もありません。
何が嬉しいのか
- マイグレーション不要 — いつでも属性を追加・削除できます。
- 混在するエンティティ — 多くのエンティティ型が 1 つのテーブルを共有できます(シングルテーブル設計)。
- 進化できる — 要件の変化に合わせてモデルが変わります。
依存している形を強制するのは、データベースではなくアプリケーションです。
スキーマレスが緩和しないもの
スキーマレスが効くのは非キー属性だけです。それ以外の DynamoDB の制限はすべてそのままです。
- アイテムあたり 400 KB — 属性名も値も上限にカウントされます。
- 値の内側のマップとリストについて ネストは 32 階層まで。
- 単一の属性名の最大長は 65,535 バイト。
BatchWriteItem呼び出しあたり最大 25 アイテム。
あるアイテムに status 文字列を載せ、次のアイテムでは省略することはできますが、どちらにも 500 KB の blob は置けません。書き込む前にペイロードを測るには item size calculator を使い、1 つのテーブルにエンティティ型を混ぜるときは シングルテーブル設計 を読んでください。
DynoTable では: 任意のテーブルで 設定 を開いてインデックス化してください。推論されたスキーマはサンプルしたアイテムから作られ、正直にラベルされています — 宣言した内容ではなく、書き込まれた内容を示します。ローカルインデックスのサンプルと更新の仕方は テーブルの概要とインデックス作成 を参照してください。
さらに詳しく
シングルテーブル設計 と、混在アイテムのための type 属性 のパターンを参照してください。実際のアイテムの形を並べて確認するには DynoTable をダウンロード してください。
参考資料
- Core components of Amazon DynamoDB — Amazon DynamoDB Developer Guide
- What is Amazon DynamoDB? — Amazon DynamoDB Developer Guide
- Data modeling for DynamoDB tables — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
2026-07-28 に、Node v24.18.0 上の @aws-sdk/client-dynamodb 3.1095.0 を用いて DynamoDB Local 3.3.0 に対して再現しました。2 つの ValidationException のメッセージはどちらもエンジンそのままの出力です。