アプリケーションやサイトにおいて、データベースはコンテンツやユーザーデータの保存、アプリ内イベントのキャプチャなど、重要な役割を担います。データベース技術は多岐にわたり、データベースの選択は、アプリケーションのアーキテクチャや開発プロセスを大きく左右します。

そこで今回は、従来の「リレーショナルデータベース」でない人気データベース、DynamoDBとMongoDBに迫ります。NoSQLデータベースがプロジェクトに適しているかどうか、そしてどちらを選ぶのが良いのかを見極めてみてください。

DynamoDBとMongoDB

NoSQLデータベースは、柔軟性とスケーラビリティに対する需要の高まりから、過去10年間人気を伸ばしています。これには、SNSとユーザー生成コンテンツの発展が大きく影響しています。

長年にわたり、ほとんどのアプリケーションでは、長年にわたって、データの各行が個別のエンティティと他のエンティティとの関係を記述するSQLデータベースが採用されていました。リレーショナルデータベースはクエリに応答する際、異なる行のデータを結合し、クライアントアプリケーションに返します。このアーキテクチャは、結果セットの各要素が通常データベース内に一度だけ格納されるため、ストレージの占有スペースを削減し、繰り返しデータの重複をなくすように最適化されています。

対照的に、NoSQLデータベースはベースとなるエンティティと関連データを1つのドキュメントに格納します。つまり、一部のデータが複数回記録され、ストレージ要件が増加することを意味します。しかし、この点はストレージコストが低下するにつれ大きな問題ではなくなり、NoSQLソリューションのスケーラビリティが優先されるようになっています。その基礎となるアーキテクチャにより、NoSQLデータベースは、複数のノードにデータを分散させたクラスタで実行するのに理想的です。

DynamoDBとは

DynamoDBは、自社ECプラットフォームのためにAmazonが開発したサーバーレスNoSQLデータベース。2012年にAmazonのクラウドホスティングプラットフォーム、Amazon Web Services(AWS)上で開発者向けにリリースされました。AmazonのECサイト同様、従来のリレーショナルデータベースのような複雑な結合なしでクエリに対応する能力を備えています。

DynamoDBは、スケールに最適化されたキーと値の組み合わせを保存するキーバリュー型であり、特定のキーに関連するすべてのデータを一緒に保存するため、結合が不要です。これによってデータベースの性能が最適化され、迅速なデータレスポンスが可能になります。

AmazonによってフルマネージドサービスとしてAWS上で提供されており、データベース管理の負荷を最小限に抑えることができるため、開発者に魅力的な選択肢です。アプリケーションの利用者が増加しても、容易に拡張でき、他のAWSツールとシームレスに統合できるのもメリットです。

DynamoDBのロゴ
DynamoDBのロゴ

DynamoDBの仕組み

DynamoDBは、NoSQLのキーバリュー型データベースです。マネージドサービスであるため、アーキテクチャやインフラストラクチャの詳細は公開されていません。

データはプライマリキーによってパーティション化され、各パーティションにはデータのコピーを保持する3つのノードが含まれます。これにより、データは複数のサーバーに分散され、スケーリングが容易に。また、データの複製により、特定のノードが故障した場合の冗長性も確保されます。

3つのノードのうち1つがリーダーノードとなり、リーダーノード経由ですべての書き込みが行われ、他2つへのノードにレプリケートされます。最初にリーダーノードに書き込むようにすることで、書き込みの一貫性を確保することができます。また、読み込みの一貫性を最適化するため、すべての読み込み操作もリーダーノードを通じて行われます。

読み取り操作が多いアプリケーションでは、パフォーマンスへの影響を考慮し、「強力な整合性のある読み込み」オプションを選択することも(デフォルトの設定は「結果整合性のある読み込み」)。これによって、読み取りをすべてのノードに分散することが可能になります。ただし、この方式では、読み取り操作前にデータがすべてのノードに完全に伝播していない場合、精度が低下することがあります。

DynamoDBのメリットとデメリット

DynamoDBの主な利点は、サーバーレスであり、スケーラブルかつ高速である点。インフラストラクチャのオーバーヘッドを最小限に抑えることができ、構成にかかる時間はほんの数分です。またAWSの一部であるため、セキュリティ、アップグレード、サーバー管理、高可用性などの恩恵も受けられます。また、使用量に応じた従量課金制の価格設定で、AWSの物理的な容量制限内であれば、無限にスケールアップ可能です。保存データ容量が増加しても、高速な読み書きとパフォーマンスを維持できるスケーリング機能も魅力的です。

一方で、利用可能なクエリが限られるのが欠点として挙げられます。キールックアップは便利ですが、集計などの複雑なクエリを実行するには、データを外部データベースにエクスポートしてから分析しなければなりません。また、AWSを通じてしか利用できないという点も、状況によってはデメリットになります。すでにAWSのエコシステムを利用しているなら問題ありませんが、オンプレミスでのデプロイを予定している場合には、DynamoDBは候補から外れるでしょう。

MongoDBとは

MongoDBは、2009年にオープンソースデータベースとして公開されたNoSQLデータベースで、商用サポート版も提供されています。JSONドキュメントをバイナリJSON(BSON)オブジェクトとして格納し、ネストしたプロパティや配列のような複雑なデータ構造を利用可能です。

Windows、macOS、Linuxなどの主要なプラットフォームで稼働し、数々のプログラミング言語に対応しています。また、Amazon、GoogleMicrosoftといった主要なクラウドサービスでも利用できます。

MongoDBの人気の理由は、その柔軟性にあります。MongoDBはNoSQLデータベース特有のメリットを活かしつつ、データ整合性のためのACID特性集約クエリ、データセットの結合など、より複雑な要件も満たしています。さらにJavaScriptもサポートしているため、JavaScriptで開発されたサイトのバックエンドデータベースとして人気を博しています。

MongoDBのロゴ
MongoDBのロゴ

MongoDBの仕組み

MongoDBは、キーと値の組み合わせからなるBSONオブジェクトを格納します。値は文字列やタイムスタンプのような単純なデータ型のほか、ネストしたオブジェクトや配列のような複雑な型にも対応します。

また、ドキュメントはコレクションに格納され、これはテーブルと行の関係に似ています。コレクション内のドキュメントは通常、同様のスキーマを使用しますが、 同じキーを持つドキュメントであってもスキーマが異なる場合があります。また、レコードの挿入や更新時には、プロパティのバリデーションを行うことが可能です。

MongoDBには、DynamoDBのパーティショニングにあたるシャーディングと呼ばれる機能があり、シャードキーに基づいてデータを複数のサーバーに分散させることができます。これによって、読み取りと書き込みの操作を複数のサーバーに分散し、単一のサーバーに過負荷がかかるのを回避します。

MongoDBのメリットとデメリット

MongoDBは、NoSQLならでは利点を享受しつつ、様々なプラットフォームで利用可能です。この点は、クラウドサービスの選択に柔軟性を求める場合や、オンプレミスのデータベースホスティングが必要な場合には重要です。

もう1つの特徴は、集約(アグリゲーション)パイプラインを通じた複雑なクエリやアグリゲーションへの対応です。分析クエリ、ドキュメント検索、データの結合といった多様な要求に柔軟に応えることができます。ただし、大規模なデータを扱う場合にはパフォーマンスが低下する可能性があります。MongoDB Atlasではサーバーレスを選択して、インフラ管理の負担を軽減することができます。

MongoDBの欠点としては、ドキュメントにデータとキーを保存する必要があるため、データのフットプリントが大きくなること。また、集約パイプラインは強力ですが、独特の構文を使用するため、記述や構築が複雑になる傾向にあります。

また、MongoDB Atlasを利用しない場合、特にレプリケーションやシャーディングを利用してパフォーマンスを確保する本番環境では、インフラストラクチャまわりの負荷がかかります。セキュリティ管理、監視、データスキューの管理、アップグレードなどがその一例です。

DynamoDBとMongoDBの比較

DynamoDBとMongoDBはいずれもNoSQLデータベースですが、特徴はそれぞれに異なり、ひいては適した用途も異なります。

DynamoDBは、スキーマレベルで利用できるデータ型の選択肢に限りがあります。例えば、日付をサポートしていないため、アプリケーション内で日付を解析して扱うロジックを保持しなければなりません。一方のMongoDBは、日付を含む豊富なデータ型に対応しています。

そして、DynamoDBはキーバリュールックアップとテーブルスキャンによるクエリが可能ですが、テーブルスキャンの性能には欠けます。そのため、複雑なクエリやアドホッククエリは、別のデータベースにエクスポートするのが最善です。対照的に、MongoDBは分析クエリとデータ結合の上にキールックアップをサポートしており、任意のフィールドにセカンダリインデックスを追加できるため、より柔軟なインデックスが可能です。DynamoDBもセカンダリインデックスをサポートしていますが、複雑で作成できる数に上限があります。

セキュリティ面においては、DynamoDBはAWSプラットフォームに支えられています。AWSのアクセス制御を経由して認証が行われるため、高いセキュリティが確保されます。

MongoDBの場合は、ユーザーアカウントの作成やネットワークアクセスの管理など、セキュリティ上の設定をすべて自分で管理しなければならず、言わずもがな相当な作業負荷がかかります。しかし、MongoDB Atlasを使ってMongoDBをマネージドソリューションに変えれば、この問題は解消できます。

マネージドソリューションとして、DynamoDBには、マルチリージョンレプリカやバックアップからの簡単なリカバリを含む、ビルトインのバックアップとリカバリ機能が組み込まれています。MongoDBではデフォルトではこのようなプロセスの管理は行われないため、手動で設定が必要です。MongoDB Atlasでこれを簡素化することはできますが、いずれにしても設定が必要になります。

DynamoDBとMongoDBの比較表

特徴 DynamoDB MongoDB
データ型 日付を除くほとんどの標準データ型 日付を含むBSON仕様のデータ型
クエリ キールックアップと限定的なマルチドキュメントクエリ キールックアップ、クエリ、結合、集約
セキュリティ AWSに組み込まれているため管理負担がほぼない MongoDB Atlasを利用しない場合は自己管理
スケーラビリティ AWSに組み込まれているため管理負担がほぼない MongoDB Atlasを利用しない場合は自己管理
バックアップとリカバリ AWSに組み込まれているため管理負担がほぼない MongoDB Atlasを利用しない場合は自己管理

MongoDBはどこにでもデプロイでき、データの保存やクエリのためのツールも豊富ですが、AWSとシームレスに統合し、インフラとセキュリティ管理の負担がほぼない、無駄のないデータベースをお探しなら、DynamoDBが有力な候補になります。

まとめ

MongoDBとDynamoDBは、それぞれに異なる特長を持つパフォーマンスに優れたNoSQLデータベースです。シンプルな用途には、効率的なソリューションであるDynamoDBがお勧めです。複雑なスキーマや集約クエリ、優れたインデックスが必要になる場合には、MongoDBの使用を検討してみてください。

MongoDBの柔軟性は、裏を返せばインフラストラクチャの自己管理という代償を意味しますが、柔軟性を確保しつつ負荷を軽減したい場合には、MongoDB Atlasを利用してみてください。

データベースはもちろん、優れたアプリケーションの開発も非常に重要です。アプリケーションの開発なら、Kinstaのアプリケーションホスティングにお任せください。手頃なホビープランで無料から利用し始めることができます。

Steve Bonisteel Kinsta

Kinstaのテクニカルエディター。救急車や消防車を追いかける記者としてキャリアをスタート。1990年代後半からインターネット関連の技術情報を担当している。