MongoDBとCouchDBは、どちらもドキュメントベースのNoSQLデータベースのタイプです。ドキュメントデータベースはmdocumentストアとも呼ばれ、通常、半構造化データのドキュメント形式とその詳細な説明を保存するために使用されます。マスタースキーマを参照しなくても、プログラムの作成と更新が可能です。モバイルアプリケーションでのコンテンツ管理とデータの処理は、ドキュメントストアを適用できる2つの分野です。
MongoDBは、2007年に始まった10genのスタートアップでした。ドキュメントストアのファミリーに由来するMongoDBは、比較的高いパフォーマンスとスケーラビリティを備えた、典型的なNoSQLのスキーマフリーデータベースの1つであり、豊富です。データ処理機能で。このオープンソースデータベースはC++で記述されており、動的スキーマを利用しています。 MongoDBのアーキテクチャには、構造に基づいてコレクションにグループ化されたドキュメントが含まれています。このデータベースはBSONを利用しています。 BSONはJSONのバイナリ表現であり、ドキュメントの保存とデータ交換をサポートします。 MongoDBでは、ビジネスサブジェクトを最小限の数のドキュメントに保存できます。ドキュメントは、複数のリレーショナルドキュメントに分割することなく、一次または二次的にインデックスを作成できます。
MongoDBの上記の機能に加えて、各セットに複数のデータコピーを含めることができる大規模なレプリカセットコレクションも提供します。レプリカセットでは、すべてのプライマリ機能(読み取りと書き込み)がプライマリセットで実行され、セカンダリセットは前者のセットに障害が発生した場合に使用されます。 MongoDBには、水平方向のスケーリングプロセスを利用するシャーディングが組み込まれています。このドキュメントストアデータベースの負荷分散プロパティは、複数のサーバーで実行されるため、データの複製と負荷分散が可能になるという事実によって正当化されます。その見返りとして、ハードウェア障害時のバックアップも提供します。また、特定のファイルをさまざまな部分に分割し、それらを個別に保存するグリッドファイルシステムを利用します。
MongoDBの一般的な機能:
- データモデルの設計により、結合の必要性が減り、スキーマを簡単に進化させることができます。
- 高速アクセスを提供する結合もトランザクションも含まれていないため、パフォーマンスが向上するため、パフォーマンスが向上します。
- 障害時にバックアップを提供でき、非常に堅牢なレプリカセットが組み込まれているため、高可用性が実現します。
- MongoDBのシャーディングプロパティにより、分散関数で高速かつ効率的な方法で実行できます。データの水平スケーリングをサポートしているため、これも可能です。
CouchDBの概要
Apache Software Foundation製品であり、Lotus Notesに触発されたCouchDBも、主に使いやすさに重点を置いたオープンソースのドキュメントベースのNoSQLデータベースです。これは単一ノードのデータベースであり、他のデータベースとまったく同じように機能します。通常、単一ノードインスタンスから開始しますが、クラスターにシームレスにアップグレードできます。これにより、ユーザーは多数のサーバーまたはVMで単一のデータベースを実行できます。 CouchDBクラスターは、単一ノードのCouchDBと比較して、高い容量と可用性を提供します。汎用言語のアーランを使用しています。 MongoDBと同様に、javascriptとmap/reduceも使用します。テーブルとしてではなく、ドキュメントのコレクションの形式でデータを保存します。更新されたCouchDBはロックレスです。つまり、書き込み中にデータベースをロックする必要はありません。このデータベースのドキュメントは、HTTPプロトコルとJSONを利用し、JSON以外のファイルを添付する機能も備えています。したがって、CouchDBは、JSON形式をサポートするすべてのアプリケーションまたはソフトウェアと互換性があります。
CouchDBの一般的な機能
- CouchDBサーバーは、データベース内で一意の名前が付けられたドキュメントを格納する名前付きデータベースをホストし、CouchDBは、データベースドキュメントの読み取りと更新(追加、編集、削除)のためのRESTfulHTTPAPIを提供します
- CouchDBは、データ、権限、構成を処理するためのブラウザベースのGUIを提供します。
- CouchDBは最も単純な形式のレプリケーションを提供します。
- CouchDBは、認証とセッションサポートを容易にします。WebアプリケーションのようなセッションCookieを介して認証を開いたままにします。
- CouchDBはデータベースレベルのセキュリティを提供し、データベースごとの権限がリーダーと管理者に分けられます。リーダーは、CouchDBデータベースの読み取りと書き込みが許可されています。
- CouchDBは、認証を使用してデータベースに挿入されたデータを検証し、作成者とログインセッションIDが同じであることを確認します。
CouchDBアーキテクチャーは分散されており、双方向同期をサポートしています。一意のIDを使用するため、スキーマは必要ありません。 CouchDBはCAPモデルのAP(可用性とパーティショントレラント)機能に従いますが、トレードされた一貫性を克服するために、実際にはACIDモデルに従います。
CouchDBとMongoDBの比較
| CouchDB | MongoDB |
データモデル | ドキュメント指向モデルに従い、データはJSON形式で表示されます。 | ドキュメント指向モデルに従いますが、データはBSON形式で表示されます。 |
インターフェース | CouchDBはHTTP/RESTベースのインターフェースを使用します。非常に直感的で、非常によく設計されています。 | MongoDBは、TCP/IPを介してバイナリプロトコルとカスタムプロトコルを使用します。 |
オブジェクトストレージ | CouchDBでは、データベースにドキュメントが含まれています。 | MongoDBでは、データベースにはコレクションが含まれ、コレクションにはドキュメントが含まれます。 |
速度 | データベースにとって読み取り速度は重要であり、MongoDBはCouchDBよりも高速です | MongoDBはより高速な読み取り速度を提供します。 |
モバイルサポート | CouchDBはAppleiOSおよびAndroidデバイスで実行でき、モバイルデバイスのサポートを提供します。 | モバイルサポートは提供されていません |
サイズ | データベースはCouchDBで拡張できます。 MongoDBは、構造が最初から明確に定義されていない場合の急速な成長に適しています。 | データベースが急速に成長している場合は、MongoDBの方が適しています。 |
クエリメソッド | クエリはmap-reduce関数を使用します。これは洗練されたソリューションかもしれませんが、従来のSQLの経験を持つ人々が学ぶのはより難しい場合があります。 | MongoDBは、Map / Reduce(JavaScript)に従って、コレクションとオブジェクトベースのクエリ言語を作成します。 SQLの知識があるユーザーにとって、MongoDBは構文が近いため、習得が容易です。 |
レプリケーション | CouchDBは、カスタムの競合解決機能を使用したマスターマスターレプリケーションをサポートしています。 | MongoDBはマスタースレーブレプリケーションをサポートしています。 |
同時実行性 | MVCC(Multi-Version Concurrency Control)に従います。 | インプレースで更新します。 |
設定 | CouchDBは可用性を優先します。 | MongoDBは一貫性を優先します。 |
パフォーマンスの一貫性 | CouchDBはMongoDBより安全です。 | MongoDB、データベースにはコレクションが含まれ、コレクションにはドキュメントが含まれます。 |
一貫性 | CouchDBは結果整合性があります。 | MongoDBは非常に一貫性があります。 |
書き込み | Erlangで書かれています。 | C++で記述されています。 |
分析 | モバイルで実行されるデータベース、マスターマスターレプリケーション、または単一サーバーの耐久性が必要な場合は、CouchDBが最適です。 | 最大のスループットを求めている場合、またはデータベースが急速に成長している場合は、MongoDBが最適です。 |
CouchDBとMongoDB:大幅に異なるクエリ
CouchDBとMongDBは、JSONドキュメントを処理するドキュメント指向のデータストアですが、クエリに関しては、両方のデータベースにこれ以上の違いはありません。 CouchDBには事前定義されたビュー(基本的にJavaScript MapReduce関数)が必要であり、MongoDBは動的クエリ(基本的には通常のRDBMSアドホックSQLクエリで慣れているもの)をサポートしています。
たとえば、GroovyのRESTClientを使用してCouchDBにデータを挿入し、以下のようにRESTful投稿を発行するには:
import static groovyx.net.http.ContentType.JSON
import groovyx.net.http.RESTClient
def client = new RESTClient("http://localhost:5498/")
response = client.put(path: "parking_tickets/1280002020",
contentType: JSON,
requestContentType: JSON,
body: [officer: "Micheal Jordan",
location: "189 Berkely Road",
vehicle_plate: "KL5800",
offense: "Parked in no parking zone",
date: "2020/02/01"])
function(doc) {
if(doc.officer == "Micheal Jordan"){
emit(null, doc);
}
}
そのビューの名前に対してHTTPGETリクエストを発行すると、次のように少なくとも1つのドキュメントが期待できます。
response = client.get(path: "parking_tickets/_view/by_name/officer_grey",
contentType: JSON, requestContentType: JSON)
assert response.data.total_rows == 1
response.data.rows.each{
assert it.value.officer == "Micheal Jordan"
}
MongoDBは、通常のデータベースで慣れているように機能します。実行時に、心が望むものをクエリできます。
MongoDBのネイティブJavaドライバーを使用して駐車違反切符の同じインスタンスを挿入します:
DBCollection coll = db.getCollection("parking_tickets");
BasicDBObject doc = new BasicDBObject();
doc.put("officer", "Micheal Jordan");
doc.put("location", "189 Berkely Road ");
doc.put("vehicle_plate", "KL5800");
//...
coll.insert(doc);
オフィサープロパティに対してクエリを発行するだけで、オフィサーMicheal Jordanによって発行されたMongoDBからチケットをクエリするには:
BasicDBObject query = new BasicDBObject();
query.put("officer", "Micheal Jordan");
DBCursor cur = coll.find(query);
while (cur.hasNext()) {
System.out.println(cur.next());
}
このブログでは、2つのドキュメントベースのNoSQLデータベース(MongoDBとCouchDB)を比較しました。この表は、これら2つのデータベース間の主なパラメトリック比較の概要を示しています。これまで見てきたように、プロジェクトの優先順位によってシステムの選択が決まります。主な違いには、レプリケーション方法とプラットフォームのサポートが含まれます。また、比較から、アプリケーションがより高い効率と速度を必要とする場合は、CouchDBよりもMongoDBの方が適していることは明らかです。ユーザーがデータベースをモバイルで実行する必要があり、マルチマスターレプリケーションも必要な場合は、CouchDBが当然の選択です。また、データベースが急速に成長している場合、MongoDBはCouchDBよりも適しています。 CouchDBを使用する主な利点は、MongoDBではなくモバイルデバイス(AndroidおよびiOS)でサポートされることです。したがって、基本的に、アプリケーション要件が異なれば、シナリオに基づいて異なるデータベースが必要になります。
MongoDBは、SQLに似たクエリ構造を使用しているため、CouchDBよりもわずかに優れていることがわかりました。前者の場合も、同じことが簡単です。また、動的クエリを使用するには、MongoDBがはるかに優れた選択肢です。両方のデータベースのセキュリティに関しては、まだ調査が進んでおり、どちらがより優れた安全な環境を提供しているかはわかりません。