この記事の内容はすべて MongoDB4.2 バージョンに基づいています。
記事ディレクトリ
1.MongoDB とは?
MongoDB は、C++ で記述された、スケーラブルでオープン ソースの自由なテーブル構造のドキュメント指向の高性能分散データベースです。リレーショナル データベース (RDBMS) と非リレーショナル データベース (NoSQL) の間のデータベースのようなもので、非リレーショナル データベースの中で最も機能が多く、リレーショナル データベースに最も近い非リレーショナル データベースです。MongoDB がサポートするデータ構造は非常に緩く、json に似た bson 形式であり、より複雑なデータ型を格納できます。
1.MongoDB の概念
理解を容易にするために、次の表で Mysql と MongoDB を比較します.Mysql の表は MongoDB のコレクションの概念に対応し、Mysql の行は MongoDB のドキュメントの概念に対応します.データベースとインデックスの概念は Mysql と一致しています.
Mysql | モンゴッド |
---|---|
データベース | データベース |
テーブル | コレクション |
行 | 書類 |
索引 | 索引 |
2.MongoDBのメリットとデメリット
最初に公式文書の最初の文を引用します。
MongoDB 4.2 マニュアルへようこそ! MongoDB は、開発とスケーリングを容易にするために設計されたドキュメント データベース
です
。MongoDB は、開発とスケーリングを容易にするために設計されたドキュメント データベースです。
そのため、MongoDB が設計の最初に提供したいのは、開発を簡素化し、拡張をサポートできるデータベースであり、高性能で高可用性という特性を備えています。
①開発の簡素化:データはJSONファイルと同様のキーと値のペアの形式でドキュメントに保存されます.この設計パターンはデータに対する制約が少なく、ドキュメントは多くのプログラミング言語のネイティブデータ型に対応しているため、開発に非常に便利です.
②拡張性:従来の縦型展開ではサーバー単体の性能に限界がありました。MongoDBのシャーディングモードは横展開に対応しており、サーバーを増設することでデータベースを拡張できます。
③高性能: WiredTigerストレージエンジンの下で、データはすぐにメモリに書き込まれ、ハードディスクへの永続化操作はバックグラウンドで非同期に完了します。同時に、レプリカ セットの読み取りと書き込みの分離とシャーディング モードのマルチ書き込みモードにより、スループットを大幅に向上させることができます。
④ 高可用性:レプリカ セット モードは、1 つまたは複数のレプリカ サーバーでデータを同期し、自動フェイルオーバーをサポートし、データの冗長バックアップを提供し、データの可用性を向上させ、データのセキュリティを確保します。
MongoDB には明らかな利点があり、バージョン 4.2 で分散トランザクションが導入されましたが、強力なトランザクション要件を持つアプリケーションに MongDB を使用することはまだ推奨されていません. さらに、複数の異なる次元で異なるタイプのデータを接続することは、リレーショナルな使用も推奨されていません.データベースが得意とするものにはMongoDB。
二、MongoDBの特徴
1. ネストされたドキュメント モデル
MongoDB のドキュメント (Mongo のドキュメントは、理解しやすいように Mysql データの一部として想像できます) は、Mongo では Bson と呼ばれる Json に似たキーと値のペア形式でデータを格納します。また、下の図に示すように、MongoDB ドキュメントはドキュメント構造をドキュメント内のフィールドまたは配列に埋め込むことができます。
ネストされたドキュメント モデルにより、アプリケーションは関連する情報を同じデータベース レコードに格納できます。その結果、アプリケーションはより少ないクエリと更新で一般的な操作を実行できるため、パフォーマンスが向上します。また、この非正規化データ モデルは、複数のドキュメントやコレクションにわたって正規化するのではなく、関連するすべてのデータを 1 つのドキュメントに結合することで、アトミック操作を容易にします。
2. モードの自由度
リレーショナル データベースでは、最初にテーブル構造を宣言する必要があります。MongoDB ではデフォルトで、コレクション内のドキュメント (Mysql のテーブルとほぼ同じと理解できます) は同じフィールドを持つ必要はなく、同じフィールドはさまざまなドキュメント には、さまざまなデータ型が存在する可能性もあります。以下に示すように、最初のデータは名前、年齢、および性別であり、2番目のデータは性別、年齢、および身長です。
> db.test.insert({
"name":"xiaoming","age":"18","sex":"男"});
WriteResult({
"nInserted" : 1 })
>
> db.test.insert({
"name":"xiaohong","age":"16","height":"165"});
WriteResult({
"nInserted" : 1 })
>
> db.test.find()
{
"_id" : ObjectId("62b49cda779f3b59142bb909"), "name" : "xiaoming", "age" : "18", "sex" : "男" }
{
"_id" : ObjectId("62b49d25779f3b59142bb90a"), "name" : "xiaohong", "age" : "16", "height" : "165" }
>
バージョン 3.2 から、MongoDB は指定された検証規則を導入します。つまり、データの検証は、挿入または更新時に人為的な検証規則に従って実行されます。バージョン 3.6 では、Json モードの検証規則が導入されました。
3. 信頼性
MongoDB はレプリカ セット モードをサポートし、リアルタイムのデータ バックアップと自動フェイルオーバーを提供します。
最小のレプリカ セット クラスターは、プライマリ ノード (プライマリ)、セカンダリ ノード (セカンダリ)、調停ノード (アービター) の 3 つのサーバーにデプロイする必要があります。マスターノードはリアルタイムでデータをスレーブノードに同期し、データのバックアップを実現し、マスターノードが異常な場合、スレーブノードはマスターノードにアップグレードされ、自動フェイルオーバーを実現します。
4. スケーラビリティ
システムの負荷を増やすことを検討する場合、垂直方向のスケーリングまたは水平方向のスケーリングについて考えるのが一般的です。垂直拡張とは、CPU、メモリ、ストレージなどのリソースを単一のサーバーに追加することを意味します.この拡張方法は、単一のサーバーのハードウェアの制限に真剣に挑戦し、拡張コストは比較的高くなります. 水平展開とは、サーバーの数を増やしてシステムの収容力を高めることを意味し、単一のサーバーのハードウェアに制限されず、複数のサーバーが連携して動作しますが、操作は垂直展開よりも複雑です。
MongoDB のシャーディング モードは、複数のマシンにデータを分散する方法です。シャーディング パターンを使用して、非常に大きなデータセットと高スループットの操作をサポートできます。シャーディング モードのコンポーネントを次の図に示します。
5. 分散トランザクションのサポート
複数ドキュメントのアトミックな操作が必要な状況に対して、MongoDB はバージョン 4.0 でレプリカ セット モードでの複数ドキュメント トランザクションのサポートを開始し、バージョン 4.2 では断片化されたクラスターでのトランザクションのサポートを開始し、分散トランザクションを実現しました。包括的な置き換え リレーショナル データベースの使用。分散トランザクションを使用すると、複数の操作、コレクション、データベース、ドキュメント、およびシャードにわたってトランザクションを使用できます。
6.ファイルストレージ
BSON では、1 つのドキュメントに最大 16 MB のデータを保存するように制限されています. ファイルが 16 MB 未満の場合は、ファイルをバイナリ データに変換し、ドキュメントとしてコレクションに保存できます。同時に、MongoDB は、16 MB を超えるデータを格納および取得するためのファイル仕様、つまり GridFS も提供します。
GridFSはファイルをブロックに分割して複数のドキュメントに保存するため、ファイル情報の一部を読みたいときにファイル全体をメモリにロードする必要がなく、システムレベルのファイルシステムよりも効率的かもしれません。大きなファイルに直面したとき. . GridFS は 16MB を超えるファイルだけでなく、任意のファイルを格納するために使用できますが、MongoDB は、格納するすべてのファイルが 16MB の制限未満の場合、GridFS ではなく単一のドキュメントに各ファイルを格納することを優先することを推奨しています。 .
参考
"MongoDB Core Principles and Practice"
Mongodb 公式ドキュメント (Guo Yuanwei 著): https://www.mongodb.com/docs/v4.2/