ITの教科書検索
入門読了 約10分

Amazon DynamoDBとは ― NoSQLデータベースの仕組みとRDSとの違い

DynamoDBは、サーバの管理が不要なNoSQLデータベースです。JOINを使わずキーでデータを持つ仕組みと、RDSとの違い、整合性やキャパシティモードを整理します。

目次
  1. Amazon DynamoDBとは
  2. テーブル・アイテム・属性
  3. パーティションキーとソートキー
  4. RDSとの違い
  5. 結果整合性と強い整合性
  6. キャパシティモード
  7. 練習問題

Amazon DynamoDBとは、サーバーレスでフルマネージドなNoSQLデータベース

Amazon DynamoDBは、キーを指定してデータを読み書きするNoSQLのデータベースです。表の結合(JOIN)は使いません。リレーショナルデータベースのRDSと並ぶ、AWSのデータベースの選択肢です。サーバの用意や管理をせずに使えます。設定・保守・可用性・バックアップまで、AWSが管理します。そのため、利用者はテーブルの設計とアプリケーションの開発に集中できます。

NoSQLという種類の意味はデータベースとはの記事で説明しています。キーバリュー型やドキュメント型といった型ごとの違いは、NoSQLの記事で比べています。DynamoDBは、NoSQLデータベースをAWS上で使えるサービスの1つです。Amazon RDSとはデータの持ち方が大きく違います。詳しくはRDSとの違いの節にまとめています。

テーブル・アイテム・属性とは、DynamoDBがデータを持つ3つの単位

DynamoDBは、テーブル・アイテム・属性という3つの単位でデータを持ちます。テーブルはアイテムの集まりで、アイテムは属性の集まりです。RDBの表に例えると、テーブルは表全体です。アイテムは1行、属性は1つの列の値にあたります。

DynamoDBのテーブルは、主キー以外の部分がスキーマレスです。スキーマレスとは、属性の種類や数を事前に決めなくてよいという意味です。同じテーブルの中でも、アイテムごとに持つ属性が違ってもかまいません。この点が、どの行も同じ列を持つRDBの表との違いです。

パーティションキーとソートキーが、アイテムの位置とクエリの絞り込みを決める

DynamoDBの主キーには、2つの種類があります。パーティションキーだけを使う単純な主キーと、パーティションキーとソートキーを組み合わせた複合主キーです。

パーティションキーだけのテーブルでは、同じパーティションキーの値を持つアイテムを2つ作れません。パーティションキーの値は、テーブル内で重ならない一意な値です。

複合主キーのテーブルでは、同じパーティションキーの値を持つアイテムを複数作れます。それらのアイテムは、同じパーティション(DynamoDB内部の保存場所)にまとめて保存されます。並び順は、ソートキーの値の順です。パーティションキーの値だけを指定すると、同じ値を持つアイテムがまとめて返ります。さらにソートキーの値の範囲を指定すると、その一部だけに絞り込めます。

顧客テーブル(パーティションキー:顧客ID)

顧客ID氏名
C001山田返る
C002佐藤

クエリ:顧客ID = C001 で取り出す

顧客ID が C001 のアイテムが1件だけ返ります。顧客IDが重なるアイテムはこのテーブルに作れません。

図のタブで、パーティションキーだけの顧客テーブルと、複合主キーの注文テーブルを切り替えられます。アイテムのまとまり方とクエリの絞り込み方の違いを比較できます。

RDSとの違いは、複数テーブルに分けて結合するか、1つにまとめるか

RDBの記事と正規化の記事で説明したとおり、RDBは重複を減らすために、顧客・注文・商品のようにテーブルを分けます。分けたテーブルは、主キーと外部キーで結合(JOIN)して、1件の注文のデータにします。

DynamoDBはJOINに対応していません。そのため、取得したいパターンに合わせて、関連する情報を1つのアイテムにまとめて持たせます。顧客名や商品名を、アイテムの中に重複して持たせる形です。これを非正規化と呼びます。

RDB(正規化)DynamoDB(非正規化)顧客テーブル顧客ID(主キー)・氏名注文テーブル注文ID(主キー)顧客ID・商品ID(外部キー)商品テーブル商品ID(主キー)・商品名外部キーで参照外部キーで参照1件のアイテム(注文テーブル)顧客ID:C001氏名:山田(顧客テーブルと重複)注文日:2026-01-05商品名:ノート(商品テーブルと重複)JOINせず1回の読み取りで取得RDB(正規化)顧客テーブル顧客ID(主キー)・氏名注文テーブル注文ID(主キー)顧客ID・商品ID(外部キー)商品テーブル商品ID(主キー)・商品名外部キーで参照外部キーで参照DynamoDB(非正規化)1件のアイテム(注文テーブル)顧客ID:C001氏名:山田(顧客テーブルと重複)注文日:2026-01-05商品名:ノート(商品テーブルと重複)JOINせず1回の読み取りで取得
RDBは顧客・注文・商品の3テーブルに分け、注文テーブルの外部キーで残り2つを参照して1件の注文のデータにします。DynamoDBは1件のアイテムの中に、顧客名や商品名を重複して持たせ、ほかのテーブルを参照せずに1回の読み取りで取り出せるようにします。

次の表は、RDSとDynamoDBの違いをまとめたものです。

Amazon RDSとAmazon DynamoDBの違い
観点Amazon RDS(リレーショナル)Amazon DynamoDB(NoSQL)
データの持ち方表(行と列)。複数のテーブルに分けて主キー・外部キーで結合するテーブル・アイテム・属性。1つのテーブルにまとめて持つことが多い
テーブルの形列(スキーマ)を事前に決める。すべての行が同じ列を持つ主キー以外はスキーマレス。アイテムごとに持つ属性が違ってもよい
複数テーブルの結合JOINで結合できるJOINに対応していない
主キー1つ以上の列を主キーに指定するパーティションキーのみ、またはパーティションキー+ソートキー

RDSのエンジンの1つであるAmazon Auroraも、表を結合して使うリレーショナルデータベースです。MySQLやPostgreSQLと互換があります。

結果整合性のある読み取りが既定で、強い整合性のある読み取りも選べる

DynamoDBの読み取りには、結果整合性のある読み取りと、強い整合性のある読み取りの2種類があります。既定(デフォルト)は結果整合性のある読み取りです。

結果整合性のある読み取りでは、書き込み直後に読み取ると、最新の値が返らないことがあります。少し時間をおいて再度読み取ると、最新の値が返ります。

強い整合性のある読み取りは、ConsistentReadというパラメータをtrueに指定すると使えます。それまでに成功した書き込みをすべて反映した、最新の値が返ります。結果整合性のある読み取りは、強い整合性のある読み取りの半分のコストです。

ただし、強い整合性のある読み取りを選べるのは、テーブルから読むときなどに限られます。グローバルセカンダリインデックスからの読み取りは、常に結果整合性です。グローバルセカンダリインデックスとは、主キーとは別の属性で検索するための索引です。

DAXは、DynamoDBの読み取りを速くする専用のキャッシュです。Amazon ElastiCacheとの違いは、ElastiCacheの記事で説明しています。

キャパシティモードは、オンデマンドとプロビジョンドの2種類

DynamoDBの課金は、キャパシティモードによって2つの方式に分かれます。オンデマンドモードと、プロビジョンドモードです。

オンデマンドモードは、処理した読み取り・書き込みのリクエストの分だけ課金されます。容量を事前に決める必要がなく、トラフィックの増減に合わせて自動で調整されます。既定で推奨されているのは、このオンデマンドモードです。

プロビジョンドモードは、利用者が指定した読み取り・書き込みの容量に対して課金されます。実際に使った量ではなく、指定した容量そのものに課金される点が、オンデマンドモードと違います。オートスケーリングを設定すると、トラフィックの変化に応じて容量を自動で調整できます。

料金は変動するため、具体額は記載していません。最新の料金はAWS公式の料金ページで確認できます。

参考にした資料

練習問題(全6問)

Q1Amazon DynamoDBの説明として最も適切なものはどれ?
Q2DynamoDBのテーブル・アイテム・属性の関係として正しいものはどれ?
Q3パーティションキーのみを主キーとするテーブルについて正しいものはどれ?
Q4パーティションキーとソートキーを組み合わせた複合主キーのテーブルで、ソートキーの役割はどれ?
Q5DynamoDBの読み取りの既定(デフォルト)の整合性モデルはどれ?
Q6DynamoDBのキャパシティモードについて正しいものはどれ?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

AWSの記事を続けて読む

AWS 全38本中30本目