DynamoDB はスキーマレスですか?

はい。DynamoDB はスキーマレスです。テーブルを作るとき、プライマリキー以外の属性やデータ型を定義することはありません。各アイテムはそれぞれ独自の属性の組を持てて、アイテムごとに自由に変わります。ですからスキーママイグレーションを走らせずにデータモデルを適応させられます。

事前に定義するもの

プライマリキーだけです。パーティションキー(必須)と任意のソートキー、そしてそれらの型です。それ以外はすべて任意で、列を宣言することはありません。

アイテムごとに変わるもの

同じテーブルにある任意の 2 件のアイテムが、まったく異なる属性を持てます。あるアイテムは emailstatus を、別のアイテムは 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 で宣言した型と一致しなければなりません。その先はすべて、書かれたとおりに受け入れられます。

タイプミスも通ります。stausstatus のつもりだったことを、書き込み時に教えてくれるものは何もありません。

何が嬉しいのか

  • マイグレーション不要 — いつでも属性を追加・削除できます。
  • 混在するエンティティ — 多くのエンティティ型が 1 つのテーブルを共有できます(シングルテーブル設計)。
  • 進化できる — 要件の変化に合わせてモデルが変わります。

依存している形を強制するのは、データベースではなくアプリケーションです。

スキーマレスが緩和しないもの

スキーマレスが効くのは非キー属性だけです。それ以外の DynamoDB の制限はすべてそのままです。

  • アイテムあたり 400 KB — 属性名も値も上限にカウントされます。
  • 値の内側のマップとリストについて ネストは 32 階層まで。
  • 単一の属性名の最大長は 65,535 バイト
  • BatchWriteItem 呼び出しあたり最大 25 アイテム

あるアイテムに status 文字列を載せ、次のアイテムでは省略することはできますが、どちらにも 500 KB の blob は置けません。書き込む前にペイロードを測るには item size calculator を使い、1 つのテーブルにエンティティ型を混ぜるときは シングルテーブル設計 を読んでください。

DynoTable では: 任意のテーブルで 設定 を開いてインデックス化してください。推論されたスキーマはサンプルしたアイテムから作られ、正直にラベルされています — 宣言した内容ではなく、書き込まれた内容を示します。ローカルインデックスのサンプルと更新の仕方は テーブルの概要とインデックス作成 を参照してください。

さらに詳しく

シングルテーブル設計 と、混在アイテムのための type 属性 のパターンを参照してください。実際のアイテムの形を並べて確認するには DynoTable をダウンロード してください。

参考資料

最終検証日 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 のメッセージはどちらもエンジンそのままの出力です。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。