sql >> データベース >  >> NoSQL >> MongoDB

NoSQLデータベースの戦い-MongoDBとCouchDBの比較

    MongoDBとCouchDBは、どちらもドキュメントベースのNoSQLデータベースのタイプです。ドキュメントデータベースはmdocumentストアとも呼ばれ、通常、半構造化データのドキュメント形式とその詳細な説明を保存するために使用されます。マスタースキーマを参照しなくても、プログラムの作成と更新が可能です。モバイルアプリケーションでのコンテンツ管理とデータの処理は、ドキュメントストアを適用できる2つの分野です。

    MongoDBの概要

    MongoDBは、2007年に始まった10genのスタートアップでした。ドキュメントストアのファミリーに由来するMongoDBは、比較的高いパフォーマンスとスケーラビリティを備えた、典型的なNoSQLのスキーマフリーデータベースの1つであり、豊富です。データ処理機能で。このオープンソースデータベースはC++で記述されており、動的スキーマを利用しています。 MongoDBのアーキテクチャには、構造に基づいてコレクションにグループ化されたドキュメントが含まれています。このデータベースはBSONを利用しています。 BSONはJSONのバイナリ表現であり、ドキュメントの保存とデータ交換をサポートします。 MongoDBでは、ビジネスサブジェクトを最小限の数のドキュメントに保存できます。ドキュメントは、複数のリレーショナルドキュメントに分割することなく、一次または二次的にインデックスを作成できます。

    MongoDBの上記の機能に加えて、各セットに複数のデータコピーを含めることができる大規模なレプリカセットコレクションも提供します。レプリカセットでは、すべてのプライマリ機能(読み取りと書き込み)がプライマリセットで実行され、セカンダリセットは前者のセットに障害が発生した場合に使用されます。 MongoDBには、水平方向のスケーリングプロセスを利用するシャーディングが組み込まれています。このドキュメントストアデータベースの負荷分散プロパティは、複数のサーバーで実行されるため、データの複製と負荷分散が可能になるという事実によって正当化されます。その見返りとして、ハードウェア障害時のバックアップも提供します。また、特定のファイルをさまざまな部分に分割し、それらを個別に保存するグリッドファイルシステムを利用します。

    MongoDBの一般的な機能:

    • データモデルの設計により、結合の必要性が減り、スキーマを簡単に進化させることができます。
    • 高速アクセスを提供する結合もトランザクションも含まれていないため、パフォーマンスが向上するため、パフォーマンスが向上します。
    • 障害時にバックアップを提供でき、非常に堅牢なレプリカセットが組み込まれているため、高可用性が実現します。
    • スケーラビリティが容易になります。
    • MongoDBのシャーディングプロパティにより、分散関数で高速かつ効率的な方法で実行できます。データの水平スケーリングをサポートしているため、これも可能です。
    • 言語はクエリが非常に豊富です。 MongoDBには、SQLクエリ言語を置き換えることができるMongoクエリ言語と呼ばれる独自のクエリ言語があります。同様に、効用関数とmapまたはreduceは、複雑な集計関数を置き換えることができます。
    図1: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が同じであることを確認します。
    図2:CouchDBアーキテクチャ REST APIを使用して、データの書き込みとクエリを実行します。また、ドキュメントの読み取り、追加、編集、および削除も提供します。 MVCC実装によるBASEではなくACIDモデルを使用します。 MongoDBがデバイスがオフラインのときにデバイスのレプリケーションをサポートするのと同じように。結果整合性と呼ばれる特別なレプリケーションモデルを使用します。 CouchDBは、データに関して非常に信頼性が高く、真剣に信頼されています。シングルノードデータベースは、追加専用のクラッシュ耐性のあるデータ構造を利用します。マルチモードまたはクラスターデータベースは、データを冗長的に保存できるため、ユーザーが必要なときにいつでも利用できるようになります。 CouchDBは、グローバルクラスターのような大きなクラスターから、モバイルデバイスのような小さなクラスターまで拡張できます。 AndroidまたはiOSデバイスで実行できるため、CouchDBは他のデータベースの中でも際立っています。

    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"])
    オフィサープロパティが「MichealJordan」であるドキュメントをクエリする関数のサンプルコード:

    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がはるかに優れた選択肢です。両方のデータベースのセキュリティに関しては、まだ調査が進んでおり、どちらがより優れた安全な環境を提供しているかはわかりません。


    1. 部分的に定義されたスキーマを使用したドキュメントのマッピング

    2. PHPドライバーを使用したMongoDB集計クエリ

    3. Spark-on-HBase:DataFrameベースのHBaseコネクター

    4. MongoDBで範囲クエリを使用してページネーションを行う方法は?