NoSQLデータベースの選択肢が氾濫する現代において、AWS DynamoDBはなぜこれほどまでに支持されているのでしょうか。
「スケールするから」「フルマネージドだから」という答えは、あまりに表面的です。
私はコンピューターサイエンスの分散システム理論を踏まえた上で、他のNoSQLと徹底的に比較することで、DynamoDBが持つ本質的な優位性と、それを活かせる導入条件を明確にしたいと思います。
まず、DynamoDBを他の主要NoSQLと隔てる最大の特徴は、一貫した低レイテンシを「約束」するアーキテクチャにあります。
MongoDBがドキュメントの柔軟性とアドホッククエリで魅了する一方、DynamoDBはアクセスパターンの事前定義を強制します。
Cassandraがマスターレス構成による耐障害性を誇る一方、DynamoDBはバックエンドのノード管理やリバランシングを完全に抽象化し、開発者はスループット設計とデータモデリングのみに集中できます。
この違いは、単なる運用負荷の差ではなく、性能変動を排除するための設計哲学の差です。
では、具体的な利点を整理してみましょう。
- プロビジョンドキャパシティによる予測可能性:オンデマンドモードも選択可能ですが、プロビジョニングでは読み書きユニットを明示し、オートスケーリングと組み合わせることで、コストと性能のトレードオフを定量的に管理できます
- きめ細かい整合性制御:結果整合性と強い整合性をAPI単位で切り替えられるため、ユースケースに応じてレイテンシとデータ鮮度を最適化できます。この選択肢は、Cassandraのチューナブルコンシステンシーとは異なり、クエリレベルで直感的に制御可能です
- TTLとストリームの連携:有効期限切れデータの自動削除と、DynamoDB Streamsを用いた変更データキャプチャがシームレスに統合されているため、リアルタイム分析やキャッシュ無効化のパイプラインが極めて構築しやすくなっています
ただし、これらの利点は無条件に享受できるわけではありません。
DynamoDBが真に輝くのは、アクセスパターンが固定的で、かつパーティションキーの設計によりホットスポットを回避できるケースに限定されます。
例えば、ユーザーIDとタイムスタンプを組み合わせた合成キーを用いれば、負荷はパーティション全体に分散されますが、逆に複雑なソートやフィルタリングを多用する業務システムでは、スキャンやフィルタ式の制約が深刻なオーバーヘッドとなります。
そこでは、むしろRDBMSやElasticsearchの方が適切でしょう。
では、いつDynamoDBを選ぶべきか。
導入基準は次の三つに集約されます。
- 要件が「キー値ルックアップ」または「限定的な範囲クエリ」に収まること
- 秒間数万リクエスト以上のスループットが想定され、かつ急激な変動が予測できること
- 運用フェーズにおけるノード監視、バックアップ計画、障害復旧のすべてをマネージドサービスに委託できる組織体制であること
これらの条件を満たすプロジェクト、例えば大規模なセッション管理、リアルタイムランキング、Iotデバイステレメトリといった領域では、DynamoDBは他を圧倒するコストパフォーマンスを発揮します。
そう。
他のNoSQLとの比較で浮かび上がるのは、機能の多寡ではなく、「開発者が制御すべき変数」と「プラットフォームが保証する不変条件」との明確な境界線です。
この境界線を正しく見極められれば、DynamoDBは単なるデータストアではなく、スケーラビリティ戦略そのものになり得るのです。
あなたのプロジェクトは、その境界線を明確に引けていますか?
はじめに:NoSQL百花繚乱の時代、なぜDynamoDBなのか

データベースの世界は、ここ十年でかつてない多様性を迎えました。
ドキュメント指向、ワイドカラム、グラフ、時系列、そしてキーバリュー。
それぞれが特定のユースケースに最適化され、エンジニアは選択の余裕と同時に、判断の難しさも手にしています。
その中でAWS DynamoDBは、発表から十数年を経た今なお、新規プロジェクトのデータストアとして最も頻繁に挙がられるサービスの一つです。
なぜでしょうか。
単に「Amazonが提供しているから」という答えでは、分散システムの専門家として納得できません。
私はこれまで複数のNoSQLを実戦投入し、スケールアウトの失敗や運用コストの爆発を目の当たりにしてきました。
その経験から言えるのは、DynamoDBが評価される本質は、性能保証と運用抽象化のバランスにあるということです。
他のNoSQLが機能のリッチさや柔軟性で差別化を図る中、DynamoDBは「予測可能なレイテンシ」と「開発者が考えるべきノイズの最小化」に全リソースを集中させています。
本記事では、この特性を掘り下げつつ、どのような条件で真価を発揮するのかを、他のキーバリューストアとの比較も交えて論じていきます。
クラウドネイティブな分散システムが求める要件とは
クラウドネイティブなシステム、特にマイクロサービスやサーバーレス構成では、データベースに以下の三つの非機能要件が厳しく問われます。
弾力性、低レイテンシの恒常性、そして運用の省力化です。
まず弾力性とは、トラフィックの変動に合わせて読み書き能力がスムーズにスケールすることを指します。
従来のRDBMSでは垂直スケールが限界でしたが、クラウドでは水平分割とノード増減が前提となります。
ここで問題になるのは、再シャーディング時のデータ移動やホットスポットの発生です。
DynamoDBは内部で一貫性ハッシュを用いたパーティショニングを実装し、かつAWSがバックエンドのノード管理を完全に隠蔽することで、開発者は「テーブルにどれだけスループットを割り振るか」という抽象度の高い設計に集中できます。
次に低レイテンシの恒常性。
これは「p99.9が常に数ミリ秒」という厳しい水準を意味します。
多くのNoSQLは平均レイテンシを謳いますが、ガベージコレクションやコンパクション、ネットワークジッターによって外れ値が発生します。
DynamoDBはストレージにSSDを採用し、バックエンドのリクエスト処理を単一のSSHベースのインフラで最適化しているため、読み取りも書き込みも極めて安定した応答時間を提供します。
この安定性は、リアルタイムゲームのスコアボードや広告オークションのような、わずかな遅延が収益に直結するシステムでは無視できないアドバンテージです。
最後に運用の省力化。
これは単に「マネージドだから」という話ではありません。
バックアップ、ポイントインタイムリカバリ、グローバルテーブルによるマルチリージョンレプリケーション、そして監視メトリクスの充実。
これらが全てAPIとコンソールから一括で制御できる状態を指します。
オンプレミスでCassandraクラスタを運用した経験がある方なら、ノードの交換やヒントハンドオフの調整にどれだけの人的コストがかかるかお分かりでしょう。
DynamoDBはそのコストをゼロに近づけます。
つまりクラウドネイティブなシステムが求めるのは、性能の数字だけでなく、その性能を維持し続けるための運用負荷の低さであり、DynamoDBはこの点で異例の完成度を持っています。
他のキーバリューストアとの決定的な違いの予感
さて、キーバリューストアとひと口に言っても、その実装は多岐にわたります。
代表的なものとして、インメモリのRedis、ディスクベースでマスターレスのCassandra、そしてDynamoDB。
これらの比較でよく語られるのは「機能の有無」ですが、私は設計の前提条件に決定的な違いがあると考えます。
Redisは超低レイテンシと豊富なデータ構造(リスト、セット、ソート済みセットなど)を提供する反面、データの永続性はオプションであり、大容量データの保存には向きません。
つまり、キャッシュやセッションストアとしての役割が主であり、信頼できるソースオブレコードにはなりにくいのです。
Cassandraはリニアスケーラビリティと高い耐障害性を持ち、書き込みスループットはDynamoDBと肩を並べます。
しかし、そのパワーの代償として、データモデリングの習得難易度と運用の複雑さがのしかかります。
パーティションキーとクラスタリングキーの設計ミスは取り返しがつかず、ノード追加時のデータリバランスには手動の計画が必要です。
また、一貫性レベルをQUORUMやALLに設定すると、レイテンシが大きく変動する点も見逃せません。
これに対しDynamoDBは、「設計時にアクセスパターンを固定する」という強い規約を最初からエンジニアに課します。
その代わり、その規約を守る限り、パフォーマンスは常に一定で、運用はAWSに委託可能です。
この「規約と保証のトレードオフ」こそが、他のキーバリューストアとの最も深い分岐点です。
RedisやCassandraが「柔軟性と制御」を提供するのに対し、DynamoDBは「予測性と管理の放棄」を提供する。
どちらが優れているかではなく、あなたのプロジェクトがどちらの価値観を重視するかで選択肢は自ずと絞られます。
この違いを認識せずに機能比較表だけを見ていては、本当の意味での導入判断は下せないでしょう。
コアアーキテクチャの復習:パーティションキーとソートキーがもたらす性能の源泉

DynamoDBの性能を語る上で避けて通れないのが、そのコアデータモデルです。
テーブルはアイテム(行)の集合であり、各アイテムは属性(列)を持ちますが、ここで最も重要なのはプライマリキーの設計です。
プライマリキーには二種類の構成があります。
一つはパーティションキーだけの単純なハッシュキー型、もう一つはパーティションキーとソートキーの複合型です。
この違いが、スケーラビリティとクエリ表現力の両方を決定づける分水嶺となります。
パーティションキーは、内部的なハッシュ関数への入力値として使われます。
このハッシュ値によってアイテムが物理的に格納されるパーティション(ノード群)が決定されるため、パーティションキーのカーディナリティと分布の均一性が、システム全体のスループット上限を左右します。
例えば、ユーザーIDをパーティションキーに選べば、ユーザー数が増えるほどパーティションも自動分割され、負荷が自然に分散されます。
しかし、カテゴリコードのように種類が少数だと、特定のパーティションにリクエストが集中し、いわゆるホットパーティション問題を引き起こします。
この点は、RDBMSのインデックス設計以上にクリティカルであり、設計フェーズで入念なアクセスパターン分析が求められるゆえんです。
一方、ソートキーを追加すると、同じパーティションキー内でのアイテムがソートキーの値で順序付けられ、範囲クエリや前方一致検索が効率的に行えるようになります。
つまり、ソートキーは「1対多」の関係を同一パーティション内で表現するための強力な道具であり、タイムスタンプや数値IDをソートキーにすることで、最新順の取得や特定期間のフィルタリングが低レイテンシで実現できます。
この構造は、リレーショナルモデルにおける複合インデックスに似ていますが、DynamoDBではそれが物理的なデータ配置と直結している点が異なります。
内部的なハッシュ分散とリクエストルーティング
では、実際にリクエストがどのように処理されるのか、内部の流れを追ってみましょう。
DynamoDBのバックエンドは、一貫性ハッシュリングを用いてパーティションを管理しています。
各パーティションは、ストレージノード上の特定の範囲を担当し、その範囲はハッシュ値の区間として定義されます。
書き込みリクエストが届くと、リクエストルーターはパーティションキーのハッシュ値を計算し、その値が属するパーティションを特定します。
その後、そのパーティションを担当するノード(リーダー)に対して処理が転送されます。
ここで注目すべきは、AWSがこのルーティング処理をゲートウェイノード群で分散させている点です。
ゲートウェイはリクエストを受け付け、メタデータサービスから最新のパーティションマップを取得して、適切なストレージノードへ転送します。
このマップは、新しいパーティションが追加されたり、スループットが変更されたりするたびに動的に更新されますが、その更新はバックグラウンドで行われ、アプリケーションからは一切見えません。
さらに、DynamoDBはリクエストのスロットリングをパーティション単位で実施します。
プロビジョンドキャパシティでは、各パーティションに割り当てられる読み書きユニットが決まっており、それを超えるリクエストはスロットリングされます。
このメカニズムは、ホットパーティションが他のパーティションに影響を与えないようにするための防衛策でもあります。
つまり、パーティションキーの設計が適切であれば、各パーティションは独立してスケールし、全体として線形なスループット向上が期待できるというわけです。
このアーキテクチャを理解せずに「とりあえずDynamoDBを使う」と、予期せぬスロットリングに苦しむことになります。
逆に、この分散原理を味方につければ、数万リクエスト/秒の処理も安定して捌けるようになります。
ローカルセカンダリインデックスとグローバルセカンダリインデックスの戦略的利用
DynamoDBはプライマリキー以外の属性での検索をサポートするために、セカンダリインデックスを提供します。
ここで選択肢となるのが、ローカルセカンダリインデックス(LSI)とグローバルセカンダリインデックス(GSI)の二種類です。
この使い分けを誤ると、性能やコストに大きな影響が出るため、それぞれの特性を正確に把握しておく必要があります。
LSIは、同じパーティションキーを持つアイテムの範囲内で、別のソートキーを提供するインデックスです。
つまり、パーティションキーはプライマリキーと同一であり、ソートキーのみが異なります。
このため、LSIはテーブル作成時にしか定義できず、かつパーティションキーが固定されるので、クエリは常に単一パーティション内に限定されます。
利点は、強い整合性を保ったままクエリできることと、追加の書き込みコストが比較的少ないことです。
ただし、パーティションあたりのインデックスサイズに制限(10GB)があるため、大規模な履歴データに対しては不向きです。
一方、GSIはパーティションキー自体を変更できるインデックスであり、テーブル作成後でも追加・削除が可能です。
GSIは独立したスループット設定を持ち、テーブルとは別にキャパシティをプロビジョニングできます。
この柔軟性は非常に魅力的ですが、その代償として、GSIへの書き込みは結果整合性しか保証されず、更新が反映されるまでに数秒のラグが生じることがあります。
また、GSIのパーティションキー設計を誤ると、インデックス側でホットパーティションが発生し、テーブル本体とは無関係なスロットリングに見舞われるケースも珍しくありません。
では、実際の設計指針を整理しましょう。
- LSIを選ぶケース:同一パーティション内での複数ソート条件が必要で、かつインデックスサイズが10GB未満に収まる場合。例えば、ユーザーごとのアクセスログを「日付」と「ステータス」の両方でソートしたいが、ユーザー単位のデータ量が大きくない場合
- GSIを選ぶケース:異なるパーティションキーでの検索が必須で、結果整合性が許容される場合。例えば、注文テーブルを「顧客ID」で検索するだけでなく「注文ステータス」で全体的にフィルタリングしたいビジネスユースケース
- GSIのスループット設計:テーブルの書き込みユニットとは独立して設定するため、読み取り頻度に合わせて最適化します。ただし、書き込み時にはテーブルとGSIの両方でキャパシティを消費する点を忘れてはいけません
以下の表に、両者の主要な違いをまとめます。
| 特徴 | ローカルセカンダリインデックス (LSI) | グローバルセカンダリインデックス (GSI) |
|---|---|---|
| パーティションキー | テーブルと同じ(変更不可) | テーブルとは異なるキーを指定可能 |
| 作成タイミング | テーブル作成時のみ | テーブル作成後でも追加・削除可能 |
| 整合性 | 強い整合性をサポート | 結果整合性のみ |
| スループット設定 | テーブルのキャパシティに依存 | 独立してプロビジョニング可能 |
| サイズ制限 | パーティションあたり10GB | 制限なし(ただしインデックス自体のサイズに注意) |
このように、LSIとGSIは一見似ていますが、内部的なデータ配置と整合性の保証がまったく異なります。
私はよく「LSIは同じパーティション内でのビュー、GSIは異なるパーティションにまたがる別のテーブル」と例えます。
この視点を持てば、どちらのインデックスをいつ使うべきか、自ずと答えが見えてくるはずです。
MongoDBとの徹底比較:ドキュメント柔軟性とクエリ表現力の代償

NoSQLの選択で最も頻繁に比較される組み合わせの一つが、MongoDBとDynamoDBでしょう。
両者は共にスケーラブルな分散データベースですが、その設計哲学は根本的に異なります。
MongoDBはドキュメントモデルの柔軟性とリッチなクエリ言語を重視し、DynamoDBは厳格なアクセスパターンと予測性能を優先します。
この違いを「機能の有無」で片付けるのは危険です。
なぜなら、それぞれのトレードオフがプロジェクトの開発効率から運用コスト、さらにはビジネス上の意思決定速度までに影響を及ぼすからです。
スキーマレスが招くアドホッククエリのメリットとデメリット
MongoDBの最大の魅力は、スキーマレスであることです。
アプリケーションの進化に合わせてドキュメント構造を自由に変更でき、新しいフィールドを追加しても既存データに影響を与えません。
これにより、開発初期の要件が流動的なフェーズでは、MongoDBは圧倒的な開発生産性を発揮します。
また、アドホックなクエリが豊富にサポートされており、等価条件だけでなく、範囲指定、テキスト検索、地理空間クエリまで、インデックスを適切に設計すれば多様な検索が可能です。
例えば、db.users.find({ "age": { "$gt": 20 }, "city": "Tokyo" }).sort({ "name": 1 }) のように、直感的なJSONライクな構文で複合条件を記述できます。
しかし、この柔軟性には代償が伴います。
スキーマレスは「暗黙のスキーマ」を生み出し、アプリケーションコードとデータの間に乖離が生じやすくなります。
特にチーム開発では、フィールドの有無やデータ型のばらつきが予期せぬバグを招くことがあります。
さらに深刻なのは、アドホッククエリのパフォーマンスがインデックス設計に完全に依存する点です。
インデックスを適切に張らなければ、全表スキャンが発生し、データ量が増えると数秒単位の遅延が常態化します。
そして、MongoDBのインデックス設計はリレーショナルと異なり、複合インデックスの順序やカーディナリティの考慮が非常に難しく、試行錯誤が求められるのです。
DynamoDBはこの点でまったく対照的です。
パーティションキーとソートキー、そして限定的なセカンダリインデックス以外での検索は事実上スキャンに頼らざるを得ません。
スキャンは全アイテムを読み込むため、大規模テーブルでは非現実的なコストとレイテンシを招きます。
つまり、DynamoDBは「どう検索するか」を事前に固定することを強制し、その代償として、インデックス設計ミスによるパフォーマンス劣化を極限まで排除します。
MongoDBは「自由」を、DynamoDBは「制約による安定性」を提供していると見るべきでしょう。
どちらが優れているかは、要件の不確実性と求められるレイテンシの厳格さで決まります。
集計パイプラインとDynamoDBの制約、どちらを選ぶか
データ分析の観点で見ると、両者の差はさらに顕著になります。
MongoDBは集計パイプラインという、SQLのGROUP BYやJOINに相当する強力なフレームワークを備えています。
$match、$group、$project、$lookupなどのステージを組み合わせることで、複数コレクションにまたがる集計や、時系列ウィンドウ処理までデータベース内部で完結できます。
これにより、ETL処理を別途用意せずとも、BIレポート用のデータ整形やダッシュボード向けのリアルタイム集計が実現可能です。
DynamoDBには、このような汎用的な集計機能は存在しません。
クエリで取得できるのは、単一パーティション内の範囲取得か、GSIを用いた別軸の取得に限られます。
集計が必要な場合は、DynamoDB StreamsとAWS Lambdaを組み合わせて、変更データを捕捉し、外部の集計用ストア(例えばElasticsearchやRedshift)に転送するアーキテクチャが一般的です。
あるいは、バッチ処理でフルスキャンを行い、EMRやAthenaで分析するパターンもあります。
では、どちらを選ぶべきか。
ここに明確な判断基準を提示します。
- MongoDBを選ぶべきケース:アドホックな集計や探索的データ分析が頻繁に発生する。レポート要件が日々変化する。開発フェーズでアクセスパターンが固まっていない。チームがスキーマ進化に慣れている
- DynamoDBを選ぶべきケース:集計パターンが事前に確定しており、かつリアルタイム性が求められる。集計自体は外部サービスにオフロード可能で、データストアは単一アイテムの高速取得に専念させたい。運用コストよりも開発の予測可能性を重視する
下記の表に、両者の主要な特性をまとめます。
| 特性 | MongoDB | DynamoDB |
|---|---|---|
| スキーマ | スキーマレス(柔軟) | 固定(ただし属性は動的) |
| アドホッククエリ | 豊富(インデックス次第) | 制限あり(キーとインデックスのみ) |
| 集計機能 | 内蔵パイプライン(強力) | なし(外部連携必須) |
| パフォーマンス予測性 | インデックス依存で変動 | 一貫して低レイテンシ |
| 運用難易度 | インデックス管理が複雑 | キャパシティ設計が中心 |
結論として、集計パイプラインのような便利機能は「無料の昼食」ではありません。
MongoDBの集計はデータベースリソースを消費し、大量データの集計は遅延やメモリ不足を引き起こす可能性があります。
一方、DynamoDBの制約は、集計をアプリケーションレイヤーや分析専用サービスに分離するという、モダンなマイクロサービスアーキテクチャのプラクティスにむしろ適合します。
どちらを選ぶかは、あなたのシステムが「データベースにどこまで処理を任せるか」という哲学の問題でもあるのです。
Cassandraとの比較:マスターレスVSフルマネージド、運用哲学の相違

分散データベースの世界で、Cassandraは「マスターレス」アーキテクチャの代表格として長らく君臨してきました。
一方、DynamoDBはフルマネージドでありながら、内部ではCassandraと同様の分散ハッシュリングを採用していると言われます。
しかし、その運用哲学はまったくの別物です。
Cassandraは制御と柔軟性をエンジニアに委ね、DynamoDBは抽象化と自動化を徹底します。
この違いは、単に「運用が楽かどうか」という次元を超えて、システム設計全体の考え方に影響を与えます。
私は両方を本番運用した経験から、この差は開発生産性と障害対応の速度に直結すると確信しています。
ノード追加・リバランシングの自動化がもたらす開発生産性
Cassandraクラスタを運用したことがある方なら、ノード追加時のリバランシング作業の複雑さをよくご存じでしょう。
新しいノードをクラスタに参加させるには、トークン範囲の再計算とデータのストリーミングを手動でトリガーし、かつクラスタ全体の負荷を監視しながら段階的に進める必要があります。
特に、vnode(仮想ノード)を採用した現代のCassandraでも、ノード追加後のデータ移動はネットワーク帯域を消費し、クラスタの性能に影響を与えるため、計画的かつ慎重な実施が求められます。
また、ノードの退役や故障時の復旧でも、同様の手作業と監視が発生します。
これらはすべて、オペレーションの属人化を招き、大規模クラスタでは専任のチームが必要になることも珍しくありません。
対照的に、DynamoDBではノードという概念が完全に隠蔽されています。
テーブルのスループットを変更するか、オートスケーリングを有効にするだけで、AWSのバックエンドが自動的にパーティション分割数やノード数を調整し、データの再分散を実行します。
このプロセスはアプリケーションから完全に透過的であり、ダウンタイムも性能低下も原則として発生しません。
開発者は「いつ、どのようにノードを追加するか」を考える代わりに、「テーブルに必要な読み書きキャパシティはどれか」というビジネス要件に集中できます。
この差は、リリースサイクルやスケーリング対応の迅速性に決定的な影響を与えます。
例えば、ブラックフライデーのような予測可能なトラフィック増加に対しては、スケジュールを設定してオートスケーリングを事前にウォームアップするだけで済みます。
Cassandraでは同様の対応に数日間の準備とリハーサルが必要になるでしょう。
この自動化がもたらす生産性向上は、数値で表せる以上の価値があります。
エンジニアがノード障害の監視やリバランスのスクリプト作成に割いていた時間を、機能開発やアーキテクチャ改善に振り向けられるからです。
さらに、自動化によってヒューマンエラーが排除されるため、障害発生時の復旧時間も劇的に短縮されます。
DynamoDBの背後には、Amazonの大規模運用ノウハウが詰まっており、その恩恵を無償で受けられることは、クラウドネイティブな組織にとって大きなアドバンテージと言えるでしょう。
一貫性レベルと障害復旧の手間を比較する
Cassandraの特徴的な機能の一つが、チューナブルコンシステンシーです。
読み取りと書き込みそれぞれに、ONE、QUORUM、ALLなどの一貫性レベルを指定でき、システム全体の整合性とレイテンシのトレードオフを細かく調整できます。
この柔軟性は非常に強力で、例えばレプリカ障害時でも、ONEを指定すれば一部ノードが応答しなくても処理を継続できます。
また、Hinted HandoffやRead Repairといった修復メカニズムも搭載されており、結果整合性の範囲内でデータの収束を図ります。
しかし、この柔軟性は運用の複雑さを増幅させます。
障害復旧時には、どのノードがどの程度のデータ遅延を持っているかを把握し、必要に応じて手動でRepairコマンドを実行してデータの同期を図らねばなりません。
特に、長期にわたるネットワーク分断やノードダウンが発生した場合、復旧後のデータ競合を解決するのは非常に困難で、アプリケーション側で最終書き込み勝ちやマージ戦略を実装する必要が生じます。
Cassandraは「AP(可用性と分断耐性)」を重視するシステムであり、その代償として一貫性の管理が開発者に強く求められるのです。
DynamoDBはこの点で、よりシンプルな選択肢を提供します。
読み取り時に強い整合性と結果整合性の二種類をAPIパラメータで切り替えられるだけです。
強い整合性は最新の書き込みがすべて反映された状態を保証しますが、その分レイテンシが若干増加し、スループットも2倍のキャパシティユニットを消費します。
結果整合性はデフォルトで、通常は数ミリ秒以内に反映されます。
この二択は、Cassandraのような多段階調整と比べて自由度は劣りますが、その分だけ設計判断が明確になります。
障害復旧に関しても、DynamoDBはほとんど運用者の手を煩わせません。
データは3つのアベイラビリティゾーンに自動レプリケーションされ、ノード障害はバックグラウンドで検出・復旧されます。
ユーザーができることは、バックアップ(オンデマンドまたはPITR)を有効にしておくことと、スロットリングが発生しないようにキャパシティを適切に設計することだけです。
Cassandraのように、障害ノードを手動で切り離し、再び参加させるようなオペレーションは一切存在しません。
以下の表に、両社の一貫性と障害復旧に関する特徴をまとめます。
| 項目 | Cassandra | DynamoDB |
|---|---|---|
| 一貫性オプション | ONE, TWO, THREE, QUORUM, LOCAL_QUORUM, EACH_QUORUM, ALL, ANY | 強い整合性、結果整合性(2種類) |
| 整合性の柔軟性 | 非常に高い | 低い(シンプル) |
| 障害検出 | Gossipプロトコルで自律検出、手動介入可能 | AWSが完全自動化 |
| 復旧作業 | 手動Repair、Hinted Handoffの確認が必要 | 自動復旧、バックアップからの復元のみ |
| データ競合の解決 | アプリケーション側で実装(Last Write Wins等) | 原則として発生しない(強い整合性採用時) |
この比較から明らかなのは、Cassandraは「制御力を手放さない」組織に適し、DynamoDBは「運用を信頼して開発に集中する」組織に適しているという点です。
どちらが優れているかではなく、あなたのチームがどのレベルの運用負荷を受け入れられるかで選択は分かれます。
私は、スタートアップやアジャイル開発が主体のプロジェクトではDynamoDBの自動化メリットが圧倒的に大きいと感じます。
一方、超低レイテンシや特定のレプリケーション戦略が必須の大規模バックエンドでは、Cassandraの柔軟性が依然として価値を持つでしょう。
Redisとの比較:メモリキャッシュと永続化ストレージの境界線

キーバリューストアという括りで語られることの多いRedisとDynamoDBですが、両者の設計目標は本質的に異なります。
Redisはインメモリデータ構造サーバーとして誕生し、サブミリ秒のレイテンシと豊富なデータ型(リスト、セット、ハッシュ、ソート済みセットなど)を武器に、キャッシュやリアルタイム処理の分野で圧倒的な存在感を示してきました。
一方、DynamoDBは永続化されたフルマネージドな分散データベースであり、データの耐久性とスケーラビリティを第一に設計されています。
この二つを単純に比較すること自体がナンセンスに思えるかもしれませんが、実際のアーキテクチャ設計では「どちらに何を格納するか」という境界線を誤ると、コストの無駄や性能要件の未達を招きます。
ここでは、価格性能比とデータ永続性、そして具体的なユースケースの二軸から、明確な棲み分けを示します。
価格性能比とデータ永続性の要件で選ぶ
まず、コスト構造から見てみましょう。
Redisはすべてのデータをメインメモリに保持するため、データ量あたりのコストが非常に高いのが特徴です。
例えば、AWSのElastiCache for Redisでは、メモリ1GBあたりの月額料金はDynamoDBのストレージコストの数十倍に達します。
しかし、その代償として得られるのはミリ秒を切る読み書きレイテンシと、スナップショットやAOFを用いた永続化オプションです。
ただし、Redisの永続化はあくまで補助的なものであり、デフォルトではデータは揮発性と見なすべきでしょう。
再起動時にデータが失われるリスクを許容できるか、あるいはレプリケーションとフェイルオーバーを徹底的に組み合わせる覚悟が必要です。
DynamoDBは、データをSSDベースのストレージに保持し、3つのアベイラビリティゾーンに自動レプリケーションを行います。
そのため、デフォルトで高い耐久性(99.999999999%) を提供し、さらにポイントインタイムリカバリ(PITR)を有効にすれば、過去35日間の任意の時点に復元可能です。
ストレージコストは月間数GBあたり数ドル程度と非常にリーズナブルで、読み書きリクエスト単位の課金体系も、トラフィックが安定していれば予測が立ちやすいと言えます。
ただし、レイテンシは通常ミリ秒単位(p99で10ミリ秒未満)であり、Redisのサブミリ秒には敵いません。
では、どちらを選ぶべきか。
ここに定量的な判断基準を提示します。
- Redisを選ぶケース:データサイズがメモリに収まる範囲(一般的に数十GB以下)で、かつ耐久性よりもレイテンシとスループットが最優先される。キャッシュ、セッション、リアルタイム集計、分散ロックなど、データが失われてもビジネス影響が限定されるシーン
- DynamoDBを選ぶケース:データサイズが数百GB〜TB級に及び、耐久性と可用性の保証が絶対条件である。金融取引、ユーザープロファイル、注文履歴、監査ログなど、データ消失が許されないシーン。または、スループットの変動が激しく、オートスケールで柔軟に対応したい場合
価格性能比で言えば、Redisは「高速だが高価で揮発性」、DynamoDBは「安定して中速で安価かつ永続的」と整理できます。
このトレードオフを理解せずに「なんとなくRedis」や「とりあえずDynamoDB」を選ぶのは、プロジェクトのリソースを浪費する原因になるでしょう。
セッションストアやリーダーボードなど具体的ユースケースの棲み分け
では、実際のユースケースに即して、両者の適材適所を見ていきましょう。
まず、Redisの最も得意とする領域は、以下のようなシナリオです。
- セッションストア:ユーザーのログイン状態や一時的なコンテキストを保持するのに最適です。有効期限(TTL)を設定すれば自動的に古いセッションが削除され、かつデータアクセスが極めて高速なため、大規模なWebアプリケーションで広く採用されています
- リアルタイムリーダーボード:ソート済みセット(Sorted Set)を用いれば、スコアに基づくランキングの更新と取得がO(log N)で完了します。ゲームやSNSのいいねランキングなど、頻繁に更新される順位情報にはRedisが圧倒的に適しています
- キャッシュ層:データベースのクエリ結果や外部APIのレスポンスをキャッシュし、オリジナルソースへの負荷を軽減します。キャッシュミス時の再生成ロジックと組み合わせれば、システム全体のパフォーマンスを劇的に向上させられます
- メッセージブローカー:Redisのリストやパブリッシュ/サブスクライブ機能を利用して、軽量なタスクキューや通知システムを構築することも可能です
一方、DynamoDBが真価を発揮するのは、永続性とスケーラビリティが必須のシナリオです。
- ユーザープロファイル:氏名、メールアドレス、設定情報など、変更頻度は低いが絶対に失ってはいけないデータ。パーティションキーにユーザーIDを設定し、ソートキーに属性種別を置けば、1対多の関係も効率的に管理できます
- トランザクション履歴:ECサイトの注文や金融取引の記録。PITRとバックアップを組み合わせることで、監査対応や障害時のロールバックも容易です
- IoTテレメトリ:デバイスIDとタイムスタンプを複合キーにすれば、時系列範囲クエリが高速に行え、かつデータ量が増えても自動パーティショニングでスケールします。TTLを設定すれば古いデータを自動削除できるため、ストレージコストの最適化も図れます
ただし、ここで重要なのは両者は排他的ではないという点です。
実際のモダンシステムでは、Redisを一次キャッシュとして配置し、DynamoDBを永続層とするハイブリッド構成が非常に有効です。
例えば、ユーザープロファイルはDynamoDBに格納し、頻繁に参照されるプロフィール情報だけをRedisにキャッシュする。
リーダーボードはRedisでリアルタイム更新し、定期的にスナップショットをDynamoDBにバックアップする。
このように、それぞれの強みを活かしたアーキテクチャを組むことで、コストと性能の最適解に近づけます。
以下の表に、代表的なユースケースと推奨ストアをまとめます。
| ユースケース | 推奨ストア | 理由 |
|---|---|---|
| セッション管理 | Redis | 高速な読み書き、TTLによる自動削除、揮発性許容 |
| リアルタイムランキング | Redis | ソート済みセットの効率的な更新と取得 |
| キャッシュ | Redis | オリジナルデータの負荷軽減、一時的な保存 |
| ユーザープロファイル | DynamoDB | 耐久性必須、スケーラブルなキー値検索 |
| トランザクション履歴 | DynamoDB | PITRとバックアップで監査対応、消失許容なし |
| 時系列テレメトリ | DynamoDB | 自動パーティショニングとTTLによるコスト管理 |
この棲み分けを意識せずに、すべてをRedisに詰め込むとメモリコストが破綻し、すべてをDynamoDBにすると不要なレイテンシやキャパシティコストが発生します。
両者の特性を正確に把握し、データの性質と要求品質に応じて使い分けること。
それが、クラウドネイティブなシステム設計の基本であり、私が推奨する実践的なアプローチです。
プロビジョニングとオートスケールの最適設計:コストを支配する読み書きユニット

DynamoDBを運用する上で、最も避けて通れないのがキャパシティ設計です。
この設計が適切かどうかで、月間のコストは数倍から数十倍単位で変動し、同時にパフォーマンスの安定性も左右されます。
DynamoDBの課金モデルは、プロビジョンドモードとオンデマンドモードの二種類があり、さらにプロビジョンドモードでは読み取りキャパシティユニット(RCU)と書き込みキャパシティユニット(WCU)という抽象単位を用いてスループットを設定します。
このユニットの意味と計算方法を正確に理解していないと、実際のトラフィックに対して過剰プロビジョニングしたり、逆にスロットリングに悩まされたりするでしょう。
ここでは、キャパシティユニットの本質から、バーストクレジットという落とし穴、そしてオンデマンドモードとの合理的な使い分けまでを、定量的な視点で解説します。
キャパシティユニットの計算式とバーストクレジットの落とし穴
まず基本を押さえましょう。
1RCUは、最大4KBまでのアイテムを1秒間に1回の結果整合性読み取り、または最大4KBまでのアイテムを1秒間に0.5回の強い整合性読み取りを実行できる能力を表します。
書き込みについては、1WCUは最大1KBまでのアイテムを1秒間に1回の書き込みを処理できる能力です。
つまり、アイテムサイズがこれらの制限を超える場合は、切り上げでユニットを消費します。
例えば、6KBのアイテムを結果整合性で読み取るには、6KB ÷ 4KB = 1.5 → 切り上げて2RCUが必要です。
書き込みで3KBのアイテムを扱うなら、3KB ÷ 1KB = 3WCUが必要になります。
この計算は地味ですが、テーブル全体のコストを左右するため、設計時に正確なアイテムサイズを見積もることが欠かせません。
次に、バーストクレジットの仕組みです。
DynamoDBは、プロビジョニングされたキャパシティを瞬時に超えるリクエストを吸収するために、各パーティションに最大5分間の未使用キャパシティをクレジットとして蓄積します。
例えば、テーブルに100WCUをプロビジョニングしていて、実際の書き込みが平均80WCUだった場合、余剰の20WCU分が毎秒クレジットとして貯まり、最大で 20WCU × 300秒 = 6,000WCU 分のバーストが可能です。
このクレジットのおかげで、トラフィックの瞬間的なスパイクに対応できるのですが、ここに落とし穴があります。
クレジットは使い切ると即座にスロットリングが発生し、その後のリクエストはプロビジョニング値に厳しく制限されます。
多くの運用者がこのバーストを「余裕」と誤解し、平均トラフィックだけを見てキャパシティを設定した結果、定期バッチ処理やキャンペーン開始時のスパイクで突然のスロットリングに見舞われるのです。
では、どう設計すべきか。
理想は、ピーク時のリクエスト率を基準にプロビジョニングし、その上でオートスケーリングを併用することです。
オートスケーリングは、設定したターゲット利用率(デフォルト70%)を維持するようにキャパシティを上下させますが、応答に数分のラグが生じるため、急激なスパイクにはバーストクレジットがカバーします。
つまり、平均+スパイクの両方を考慮した設計が必須であり、そのためにはCloudWatchメトリクスでConsumedReadCapacityUnitsとProvisionedReadCapacityUnitsの差分を継続的に監視する運用が求められます。
この監視を怠ると、バーストクレジットが尽きた瞬間にエラー率が急上昇するという、多くのプロジェクトが経験する典型的な障害パターンに陥るでしょう。
オンデマンドモードとの使い分け基準を定量的に
プロビジョンドモードに対する選択肢として、2018年に導入されたオンデマンドモードがあります。
こちらはキャパシティを事前に設定せず、リクエスト単位で従量課金されるモデルです。
読み取りリクエスト単位(RRU)と書き込みリクエスト単位(WRU)という別の単位が使われ、料金はプロビジョンドモードの約5〜7倍程度の単価になります。
しかし、管理の手間はゼロになり、スロットリングも事実上発生しません(ただし、過去30分間のピークトラフィックの2倍までというソフトリミットは存在します)
では、この二つをどのように使い分けるか。
ここでは定量的な基準を示します。
まず、トラフィックパターンが予測可能で、かつ安定している場合、プロビジョンドモードが圧倒的に経済的です。
例えば、1秒間に平均100WCU、ピークで150WCUの書き込みが発生するシステムでは、プロビジョンドモードで150WCUを設定し、オートスケールを掛ければコストはオンデマンドの約20〜30%に抑えられます。
逆に、トラフィックが不定期で、スパイクと閑散期の差が10倍以上ある場合、オンデマンドモードが有効です。
例えば、月次バッチ処理でだけ書き込みが集中し、それ以外はほぼゼロというワークロードでは、プロビジョンドモードでピークに合わせるとほとんどの時間帯でキャパシティが無駄になり、オンデマンドの方が結果的に安くなります。
もう一つの判断軸は、開発フェーズや負荷試験の段階です。
本番前の不確定な時期には、オンデマンドモードを選択してスロットリングのリスクを排除し、アクセスパターンが固まった段階でプロビジョンドモードに移行する戦略が推奨されます。
AWSはテーブル単位でモードを変更できるため、この段階的アプローチが容易です。
ただし、移行時には少なくとも数分のダウンタイムが発生する点に注意してください。
以下の表に、両モードの特性を定量的に比較します。
| 評価軸 | プロビジョンドモード(オートスケール併用) | オンデマンドモード |
|---|---|---|
| 単位単価(書き込み) | 1WCUあたり約$0.00065/時間(月間約$0.47) | 1WRUあたり$1.25/100万リクエスト |
| 単位単価(読み取り・結果整合性) | 1RCUあたり約$0.00013/時間(月間約$0.09) | 1RRUあたり$0.25/100万リクエスト |
| スロットリングリスク | 設計次第(バーストクレジット枯渇で発生) | 原則なし(ソフトリミットあり) |
| 管理コスト(人的) | 監視・調整が必要 | ほぼ不要 |
| 推奨ワークロード | 安定または予測可能なトラフィック | 不定期・急変動・開発初期 |
具体的な分岐点を数値で示すなら、平均スループットが1秒間に5WCUまたは25RCUを超えるプロジェクトでは、プロビジョンドモードの方が年間コストで有利になるという試算が一般的です。
この閾値はリージョンやアイテムサイズで変動しますが、大まかな目安として覚えておくと良いでしょう。
また、オンデマンドモードでもPITRやTTL、グローバルテーブルといった高度機能はすべて利用可能なので、機能面での制約はほとんどありません。
最終的な判断は、「予測可能性」と「運用リソース」のトレードオフで決まります。
コスト最適化を徹底するならプロビジョンド+オートスケール+詳細監視。
開発速度と運用負荷の削減を優先するならオンデマンド。
そして、ハイブリッド戦略として、本番テーブルはプロビジョンド、検証用テーブルはオンデマンドという使い分けも現実的です。
いずれにせよ、月次の請求書を前に後悔しないためにも、この定量的な基準を自らのプロジェクトに適用してみてください。
導入基準を定義する:アクセスパターン・スループット・レイテンシからの逆算

これまでの比較を経て、DynamoDBがどのようなNoSQLと差別化され、どのような特性を持つかは明らかになったでしょう。
しかし、最も実践的な問いは「私のプロジェクトに導入すべきか」という判断です。
この判断を感覚や流行で行うのは危険です。
私は、アクセスパターン、スループット要件、許容レイテンシの三つの軸から逆算することを推奨します。
この逆算プロセスを経れば、DynamoDBが最適解か、あるいは他の選択肢がふさわしいかが自ずと見えてきます。
ここでは、その判断を支える具体的な基準と、導入時に必ず検討すべき三つの設計ポイントを掘り下げます。
ホットパーティションを回避するためのキー設計パターン
DynamoDBの性能劣化の大部分は、ホットパーティションに起因します。
これは、特定のパーティションキーにリクエストが集中し、そのパーティションのキャパシティ上限を超えることでスロットリングが発生する現象です。
これを回避するには、パーティションキーのカーディナリティを高く保ち、かつアクセスが均等に分散されるように設計することが絶対条件です。
実践的なパターンとして、まず合成キーの利用があります。
例えば、ユーザーIDだけをパーティションキーにすると、アクティブユーザーに負荷が偏る場合があります。
そこで、ユーザーID_#_日付のハッシュ のように、時間やランダム要素を組み合わせてキーを生成し、パーティションを細分化します。
ただし、この場合、特定のユーザーの全データを一度に取得するにはスキャンが必要になるため、アクセスパターンとのトレードオフを慎重に検討してください。
次に、ソルト(ランダムサフィックス) を用いる方法です。
予め決められた少数のバケット(例えば0〜9)をキーに付与し、同一の論理IDでも物理的には10個のパーティションに分散させます。
これにより、特定のエンティティへのアクセスが複数のパーティションに分散され、ホットスポットを和らげます。
ただし、クエリ時に全バケットを並行して取得する必要があり、アプリケーション側の複雑さが増す点は許容しなければなりません。
最後に、時間ベースのキー設計では、タイムスタンプをソートキーに含めることで、最新データへのアクセスを特定のパーティションに集中させない工夫が重要です。
例えば、年-月-日-時間 の粒度でパーティションを切り替えると、現在時刻周辺のパーティションだけが高負荷になります。
これを避けるには、ランダムなシャードIDをパーティションキーの一部に含め、複数のパーティションにまたがって時系列データを分散させるパターンが有効です。
どのパターンを選ぶにせよ、実際のトラフィック分布を想定した負荷テストが必須であり、設計段階でこの検証を怠ると、本番稼働後の修正はテーブル再作成に等しいコストを伴うことを覚悟してください。
トランザクションや複数テーブルJOINが不要という前提条件
DynamoDBは、リレーショナルデータベースのような複数テーブル間のJOINや、複雑なトランザクションを前提とした設計には根本的に向いていません。
DynamoDBのトランザクション機能(TransactGetItemsとTransactWriteItems)は存在しますが、これらはACID性を必要とする限定的なケース(例えば、口座間の残高移動)のために提供されており、パフォーマンスとコストの面で通常の操作よりも大幅にペナルティがあります。
また、JOIN相当の処理はアプリケーション側で複数回のクエリを発行して実装するしかなく、ネットワークラウンドトリップが増えるため、レイテンシとスループットに悪影響を及ぼします。
したがって、DynamoDBを導入する際の大前提は、データモデルを事前に非正規化し、単一テーブルで完結するクエリパターンに落とし込むことです。
つまり、関連データをあらかじめ同じアイテムに埋め込むか、あるいは複数のテーブルに分割してもアプリケーションが個別に取得できるように設計します。
この非正規化は、RDBMSの正規化設計に慣れたエンジニアにとっては違和感があるかもしれませんが、分散システムではこれが性能とスケーラビリティを得るための常套手段です。
導入判断の基準として、次のチェックリストを用意しました。
これらの項目に一つでも該当する場合、DynamoDBは不適切か、あるいは大規模な設計見直しが必要です。
- 複数のテーブルをまたぐJOINが頻繁に必要で、かつそれらを非正規化できない
- 複数アイテムにまたがる複雑なトランザクションがビジネスロジックの中心である
- アドホックな集計や探索的クエリが開発フェーズだけでなく運用フェーズでも継続的に発生する
- スキーマの進化が頻繁で、過去データのマイグレーションをデータベース側で自動処理したい
これらの条件に当てはまるなら、むしろPostgreSQLやMongoDB、あるいは分析向けのサービスを検討すべきでしょう。
DynamoDBは「シンプルで予測可能なアクセスパターン」を前提として最大のパフォーマンスを発揮するように設計されていることを、常に念頭に置いてください。
バッチ書き込みとストリーム処理の親和性
DynamoDBの導入基準を考える上で、バッチ処理とストリーム処理のサポートは見過ごせないアドバンテージです。
BatchWriteItem APIを用いれば、最大25アイテムまたは16MBまでの書き込みを一度のリクエストで送信でき、ネットワークオーバーヘッドを大幅に削減できます。
これは、ログの一括取り込みや定時バッチ更新などのシナリオで非常に効果的です。
また、BatchGetItemも同様に複数アイテムを並列取得できるため、アプリケーション側でループを回すよりも効率的です。
さらに、DynamoDB Streamsは、テーブル内のアイテムレベルの変更(作成、更新、削除)をほぼリアルタイムでキャプチャし、それをLambda関数やKinesisに連携できる強力な機能です。
これにより、変更データキャプチャ(CDC)を用いたキャッシュ更新、Elasticsearchへの連携、集計用ストアへの同期、あるいは監査ログの出力など、多様なリアクティブアーキテクチャを構築できます。
特に、ストリームのシャード数はテーブルのパーティション数と連動するため、スケールに応じて自動的に並列処理能力が向上する点は、大規模システムにとって非常に魅力的です。
このバッチ書き込みとストリーム処理の親和性は、DynamoDBをイベントソーシングやCQRS(Command Query Responsibility Segregation)の基盤として利用する道を開きます。
例えば、書き込みはDynamoDBに一括で行い、そのストリームをトリガーに読み取り専用のビューを構築する、といったパターンです。
このようなアーキテクチャがプロジェクトの要件に合致するなら、DynamoDBはむしろ最適な選択肢となり得ます。
逆に、バッチ処理が不要で、ストリームを利用する予定がない場合でも、DynamoDBの価値は損なわれませんが、導入基準の評価においてこの機能を考慮することで、より長期的なシステム拡張性を見据えた判断が可能になるでしょう。
総括:DynamoDBが最適解となるプロジェクトの型と、見送るべきケース

ここまで、DynamoDBのアーキテクチャ、MongoDB・Cassandra・Redisとの比較、そしてキャパシティ設計や導入基準に至るまで、多角的に検討してきました。
この総括では、それらの知見を統合し、「DynamoDBを選ぶべきプロジェクトの型」と「明確に避けるべきケース」を、実践的な判断軸として提示します。
数多くのプロジェクトを観察してきた経験から言えるのは、DynamoDBは「銀の弾丸」ではなく、特定の条件が揃ったときにのみ真価を発揮する、極めて専門性の高いツールだということです。
その条件を正確に理解することが、成功するデータストア選定の第一歩です。
まず、DynamoDBが最適解となるプロジェクトの型を定義しましょう。
それは、以下の三つの条件をすべて満たすシステムです。
- アクセスパターンが事前に完全に固定されている:ユーザーIDによるプロファイル取得、デバイスIDとタイムスタンプによるテレメトリ範囲取得、注文IDによる単一アイテム取得など、クエリの種類が数パターンに限定され、かつそれらが変更される見込みが極めて低い。これにより、パーティションキーとソートキー、そして必要最小限のGSIだけで全てのユースケースをカバーできる
- スループット要件が明確で、かつ水平スケールが必須である:秒間数万〜数十万リクエストが想定され、かつ将来のトラフィック増加が確実に見込まれている。RDBMSの垂直スケールではコストまたは性能限界に達することが明らかであり、自動パーティショニングによる線形スケーラビリティが不可欠である
- 運用リソースを開発に集中させたい:データベースのノード監視、バックアップ計画、障害復旧手順の策定にエンジニアリングリソースを割きたくない。マネージドサービスに運用を委託し、アプリケーションロジックやビジネス価値の創出に注力したい組織方針である
これらの条件に合致する代表的な事例を挙げましょう。
大規模なSaaSプラットフォームでのユーザーセッション管理、IoTプラットフォームでのデバイステレメトリ蓄積、ゲームアプリでのプレイヤーランキングやマッチング履歴、Eコマースサイトでのカート情報や注文履歴の高速参照。
いずれも、キーとなる識別子でデータを取得するというシンプルなパターンが大部分を占め、かつデータ量とリクエスト数が時間とともに増加することが見込まれます。
これらのプロジェクトでは、DynamoDBはコスト、性能、開発生産性のすべてにおいて優れた選択肢となります。
では逆に、DynamoDBの導入を明確に見送るべきケースはどのようなものでしょうか。
以下のリストに該当する場合、私は他のデータストアを強く推奨します。
- アドホックな分析や探索的クエリが頻発する:経営陣やデータサイエンティストが「とりあえずこの条件で集計してみたい」という要求を日常的に行う。DynamoDBではスキャンやGSIの追加で対応せざるを得ず、コストとレイテンシが急激に悪化します。このケースでは、MongoDBの集計パイプラインや、PostgreSQL+OLAP拡張、あるいはBigQueryなどの分析専用サービスが適切です
- 複数エンティティ間のJOINや複雑なトランザクションがビジネスロジックの中心である:会計システムや在庫管理のように、複数のテーブルを跨いでアトミックに更新する必要があり、かつそれらを非正規化できないドメイン。DynamoDBのトランザクションは補助的なものであり、複雑な依存関係を持つデータモデルには耐えられません。ここではRDBMSを選ぶのが無難です
- スキーマが頻繁に変更され、過去データのマイグレーションがデータベース側で透過的に処理されることを期待する:スタートアップのMVPフェーズのように、プロダクトの方向性が日々変わり、属性の追加・削除・型変更が週単位で発生する。DynamoDBはスキーマレスな属性追加は許容しますが、インデックスの再構築や大規模なデータ変換は運用負荷が大きく、MongoDBの柔軟性には敵いません
- データサイズが小さく、かつ単一ノードで十分な処理能力がある:数万レコード程度の小規模なシステムで、かつ将来のスケールも見込めない場合。DynamoDBのオーバーヘッド(リクエスト単位課金や最低キャパシティ)はコスト的に不利で、むしろ無料枠のあるRDBMSやファイルベースのストレージで十分です
これらの判断をより具体的にするために、以下の簡易チェックリストを用意しました。
プロジェクトの要件をこの表に照らし合わせてみてください。
| 評価項目 | DynamoDB適性(高) | DynamoDB適性(低) |
|---|---|---|
| アクセスパターン | 事前に固定、種類は5未満 | アドホックで多様、頻繁に追加 |
| データ量 | 数百GB〜TB級、成長が見込める | 数GB未満、成長なし |
| スループット | 秒間数万リクエスト以上 | 秒間数百リクエスト未満 |
| トランザクション要件 | 単一アイテムの原子性で十分 | 複数アイテム・複数テーブルに跨るACID必須 |
| 運用リソース | 最小限にしたい | 専任のDBAがおり、細かいチューニングが可能 |
この表で「適性(高)」が三つ以上該当すれば、DynamoDBは有力な候補です。
逆に「適性(低)」が二つ以上該当するなら、他の選択肢を真剣に検討すべき段階でしょう。
最後に、私が強くお伝えしたいのは、データベース選定は「正解」ではなく「トレードオフの最適化」 であるという点です。
DynamoDBは、性能の予測性と運用の自動化という価値を提供する代わりに、設計の柔軟性とクエリ表現力を制限します。
このトレードオフを受け入れられるプロジェクトでは、他のNoSQLと比較しても圧倒的なリターンをもたらすでしょう。
しかし、受け入れられない場合、どれだけAWSが推奨していようと、それは誤った選択です。
あなたのプロジェクトは、どのようなトレードオフを許容できますか。
その問いに対する明確な答えを持っているなら、DynamoDBを選ぶべきかどうかは、すでに自ずと見えているはずです。


コメント