MongoDB vs DynamoDB 徹底比較
概要と歴史
NoSQLとは
NoSQL(Not only SQL)は、従来のリレーショナルデータベース(RDBMS)とは異なるデータモデルを採用するデータベースの総称である。固定的なスキーマを持たず、スケーラビリティと柔軟性に優れている。
NoSQLの主な種類:
| 種類 | 説明 | 代表例 |
|---|---|---|
| ドキュメントDB | JSONライクなドキュメントを格納 | MongoDB, CouchDB |
| キーバリューDB | キーと値のペアを格納 | DynamoDB, Redis |
| カラムファミリDB | 列指向でデータを格納 | Cassandra, HBase |
| グラフDB | ノードとエッジの関係を格納 | Neo4j, Neptune |
MongoDBとは
MongoDBは、2009年にMongoDB, Inc.(旧10gen)がリリースしたドキュメント指向のNoSQLデータベースである。BSON(Binary JSON)形式でデータを格納し、柔軟なスキーマと強力なクエリ機能を提供する。
MongoDBの名前は「humongous(巨大な)」に由来し、大量のデータを扱うことを目的として設計された。
DynamoDBとは
DynamoDBは、2012年にAmazon Web Services(AWS)がリリースしたフルマネージドのNoSQLデータベースサービスである。Amazonが社内で使用していたDynamoデータベースの設計を基に、キーバリューとドキュメントの両方のデータモデルをサポートする。
DynamoDBの特徴は、サーバーレスでスケーラビリティが事実上無制限であり、運用管理が不要な点にある。
主要なマイルストーン
| 年 | MongoDB | DynamoDB |
|---|---|---|
| 2007年 | 開発開始(10gen社内) | - |
| 2009年 | v1.0リリース | - |
| 2012年 | v2.2(集約パイプライン) | DynamoDBリリース |
| 2015年 | v3.2(ドキュメントバリデーション) | DynamoDB Streams |
| 2017年 | v3.6(Change Streams) | DAX(キャッシュ)、Global Tables |
| 2018年 | MongoDB Atlas(マネージドサービス)本格展開 | トランザクション対応 |
| 2020年 | v4.4(Hedged Reads) | PartiQL対応 |
| 2022年 | v6.0(暗号化クエリ) | - |
| 2023年 | v7.0(Queryable Encryption GA) | ゼロETL統合 |
強みと弱み
MongoDBの強みと弱み
| 観点 | 強み | 弱み |
|---|---|---|
| スキーマ柔軟性 | スキーマレスでドキュメント構造を自由に変更 | スキーマの一貫性を自分で管理する必要 |
| クエリ言語 | 豊富なクエリ演算子、集約パイプライン | SQLに慣れた人には学習が必要 |
| 集約フレームワーク | パイプラインベースの強力なデータ処理 | 複雑なパイプラインは可読性が低下 |
| インデックス | 多種多様なインデックス(複合、テキスト、地理空間) | インデックス設計が重要 |
| レプリカセット | 自動フェイルオーバー、高可用性 | レプリカセットの管理(Atlas使用で解消) |
| Atlas | フルマネージドクラウドサービス | ベンダーロックインの可能性 |
| トランザクション | v4.0以降でマルチドキュメントトランザクション対応 | RDBMSほどの成熟度はない |
| 水平スケーリング | シャーディングによるスケールアウト | シャードキーの設計が重要 |
| エコシステム | Mongoose(Node.js)、各言語ドライバーが充実 | ODMの選択が必要 |
DynamoDBの強みと弱み
| 観点 | 強み | 弱み |
|---|---|---|
| マネージド | 完全サーバーレス、運用管理不要 | AWSに完全依存 |
| スケーラビリティ | 事実上無制限の水平スケーリング | スケーリングの遅延(オンデマンドで改善) |
| パフォーマンス | 一桁ミリ秒のレイテンシ(一貫して) | 複雑なクエリはサポートされない |
| 料金モデル | 使った分だけ課金(オンデマンド) | 高トラフィック時のコスト予測が困難 |
| Global Tables | マルチリージョンレプリケーション | コストが高い |
| DAX | インメモリキャッシュでマイクロ秒レイテンシ | 追加コスト |
| Streams | 変更データキャプチャ | Lambdaとの統合が前提 |
| クエリ制限 | パーティションキー/ソートキーベースの効率的なアクセス | 柔軟なクエリが困難(GSI/LSIで対応) |
| トランザクション | TransactWriteItems/TransactGetItems | 25アイテムまでの制限 |
データモデルの比較
MongoDBのデータモデル
MongoDBは「ドキュメント」を基本単位とする。
データベース → コレクション → ドキュメント
用語対応(RDBMS ↔ MongoDB):
データベース ↔ データベース
テーブル ↔ コレクション
行(レコード)↔ ドキュメント
列(カラム) ↔ フィールド
JOIN ↔ 埋め込みドキュメント or $lookup
ドキュメントの例:
{
"_id": "ObjectId('...')",
"name": "田中太郎",
"email": "tanaka@example.com",
"addresses": [
{ "type": "home", "city": "東京" },
{ "type": "work", "city": "横浜" }
],
"orders": [{ "product": "ノートPC", "price": 150000 }]
}
DynamoDBのデータモデル
DynamoDBは「テーブル」「アイテム」「属性」で構成される。
テーブル → アイテム → 属性
キー構造:
パーティションキー(PK): データの分散を決定する必須キー
ソートキー(SK): PK内でのソート順を決定するオプションキー
→ PK + SK の組み合わせが一意識別子
DynamoDBのテーブル設計例(Single Table Design):
PK | SK | データ
------------|-----------------|----------------
USER#001 | PROFILE | {name: "田中", email: "..."}
USER#001 | ORDER#20240101 | {product: "ノートPC", price: 150000}
USER#001 | ADDRESS#home | {city: "東京"}
データモデリングの違い
| 観点 | MongoDB | DynamoDB |
|---|---|---|
| スキーマ | スキーマレス(オプションでバリデーション可能) | スキーマレス(キー構造は固定) |
| リレーション | 埋め込み or 参照($lookup) | Single Table Design推奨 |
| 正規化 | 非正規化を推奨するが正規化も可能 | 非正規化が基本 |
| 設計の柔軟性 | 高い(後から構造変更しやすい) | 低い(アクセスパターンを事前に設計) |
| JOIN相当 | $lookup(集約パイプライン) | なし(アプリケーション側で結合) |
CAP定理との関係
CAP定理は、分散システムにおいて「一貫性(Consistency)」「可用性(Availability)」「分断耐性(Partition tolerance)」の3つを同時に満たすことはできないという定理である。
| 特性 | MongoDB | DynamoDB |
|---|---|---|
| デフォルトの一貫性 | 強整合性(プライマリ読み取り) | 結果整合性(Eventual Consistency) |
| 強整合性オプション | Read Concern "majority" | ConsistentRead: true |
| 可用性 | レプリカセットによる自動フェイルオーバー | マルチAZで高可用性 |
| 分断耐性 | シャーディング対応 | AWSインフラで保証 |
| CAP分類 | CP(一貫性 + 分断耐性) | AP(可用性 + 分断耐性)※設定次第 |
パフォーマンス比較
レイテンシ
| 操作 | MongoDB(Atlas) | DynamoDB |
|---|---|---|
| 単一ドキュメント読み取り | 1-5ms | 1-5ms |
| 単一ドキュメント書き込み | 2-10ms | 1-5ms |
| 複雑なクエリ | 10-100ms(インデックス依存) | N/A(複雑なクエリ不可) |
| 集約処理 | 10-1000ms(データ量依存) | N/A(Lambdaで処理) |
| DAXキャッシュ | N/A | <1ms |
スケーラビリティ
| 観点 | MongoDB | DynamoDB |
|---|---|---|
| 水平スケーリング | シャーディング(手動設計) | 自動(パーティション分散) |
| 最大ドキュメントサイズ | 16MB | 400KB |
| 最大コレクション/テーブルサイズ | 事実上無制限 | 事実上無制限 |
| スループット | シャード数に依存 | オンデマンド or プロビジョンド |
| Global分散 | Atlas Global Clusters | Global Tables |
適しているユースケース
MongoDBが適しているケース
- コンテンツ管理: ブログ、CMS、メディアメタデータ
- IoTデータ収集: 多様なセンサーデータの格納
- カタログ管理: EC商品カタログ(属性が商品ごとに異なる)
- リアルタイム分析: 集約パイプラインによるデータ処理
- モバイルアプリバックエンド: Realm(モバイルDB)との同期
- プロトタイピング: スキーマの柔軟な変更
- マルチクラウド: AWS、GCP、Azureに対応(Atlas)
DynamoDBが適しているケース
- サーバーレスアーキテクチャ: Lambda + API Gateway + DynamoDB
- ゲームのランキング・セッション: 低レイテンシ要件
- セッション管理: 高速な読み書き
- IoTデータストア: 大量のセンサーデータ(時系列)
- ショッピングカート: 高可用性、一貫したパフォーマンス
- ユーザープロファイル: キーベースの高速アクセス
適していないケース
| 状況 | MongoDB | DynamoDB |
|---|---|---|
| 複雑なJOINが多い | RDBMSを検討 | 不可能(アプリ側で処理) |
| 厳格なACIDトランザクション | RDBMSの方が堅牢 | 25アイテムまでの制限 |
| アドホッククエリが頻繁 | 対応可能 | GSI設計が必要、柔軟性に欠ける |
| マルチクラウド | 対応(Atlas) | AWSのみ |
| ローカル開発 | 対応 | DynamoDB Local(機能制限あり) |
採用企業の実例
MongoDB
| 企業 | 用途 |
|---|---|
| eBay | 商品カタログ、検索 |
| Forbes | コンテンツ管理 |
| Bosch | IoTデータ管理 |
| Cisco | ネットワーク管理 |
| Adobe | Creative Cloudメタデータ |
| SEGA | ゲームデータ管理 |
| Toyota | コネクテッドカーデータ |
DynamoDB
| 企業 | 用途 |
|---|---|
| Amazon | ショッピングカート、セッション |
| Netflix | ユーザーデータ、ブックマーク |
| Airbnb | 検索セッション |
| Samsung | SmartThings IoTデータ |
| Lyft | ライドデータ |
| Snap | メッセージング |
| Duolingo | ユーザー進捗データ |
コスト比較
MongoDB Atlas
| プラン | 特徴 | 月額(概算) |
|---|---|---|
| Free(M0) | 512MB、共有クラスター | 無料 |
| Serverless | 従量課金 | 読み書き量に応じた課金 |
| Dedicated(M10+) | 専用クラスター | $57/月〜 |
DynamoDB
| 項目 | オンデマンド | プロビジョンド |
|---|---|---|
| 読み取り | $1.25/100万RRU | $0.00065/RCU/時 |
| 書き込み | $6.25/100万WRU | $0.00065/WCU/時 |
| ストレージ | $0.25/GB/月 | $0.25/GB/月 |
| 無料枠 | 25GB + 25WCU + 25RCU/月 | 25GB + 25WCU + 25RCU/月 |
選択の判断基準
| 判断基準 | MongoDB | DynamoDB |
|---|---|---|
| クラウド依存 | マルチクラウド対応 | AWSのみ |
| クエリの複雑さ | 複雑なクエリ可能 | シンプルなアクセスパターン |
| 運用負荷 | Atlas使用で軽減 | 完全マネージド |
| 開発の柔軟性 | 高い | アクセスパターン事前設計が必要 |
| コスト予測 | 比較的予測しやすい | トラフィックに依存 |
| AWSエコシステム | 独立 | 深い統合(Lambda、AppSync等) |
| ローカル開発 | 容易 | DynamoDB Localで対応(制限あり) |
まとめ
MongoDBとDynamoDBは、NoSQLの中でも異なるアプローチを取るデータベースである。
MongoDBを選ぶべき場合:
- 柔軟なクエリが必要
- マルチクラウドで運用したい
- ドキュメントの構造が複雑で多様
- 集約処理(分析)が重要
- 開発時の柔軟性を重視
DynamoDBを選ぶべき場合:
- AWSエコシステムに統合したい
- サーバーレスアーキテクチャ
- 予測可能なアクセスパターン
- 運用管理をゼロにしたい
- 一桁ミリ秒のレイテンシが必須
どちらを選ぶにせよ、NoSQLデータベースの選択において最も重要なのは「アクセスパターンの理解」である。どのようなクエリでデータにアクセスするかを事前に設計し、それに最適なデータモデルを構築することが成功の鍵となる。