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

MongoDBがfsync()を使用しないのはなぜですか?

    その理由はパフォーマンスです。変更のたびにディスクに書き込む必要がないため、MongoDBは更新をより高速に処理できます。

    MongoDBは、更新が配信されたときに通知します 更新が書き込まれたときではなく、サーバーに送信されます 、VerifyingPropagationのドキュメントで読むことができますgetLastErrorを使用した書き込みの数

    これは、ACID に反します。 、より具体的には、耐久性を表すDに対して :

    ACIDプロパティは、主に従来のRDBMSシステムに適用されます。 MongoDBを含むNoSQLシステムは、スケーラビリティを向上させるために、1つ以上のACIDプロパティを放棄します。 MongoDBの場合、耐久性が犠牲になっています 大量の更新を処理するときのパフォーマンスを向上させるため。

    MongoDBとACID

    ほとんどのACIDプロパティは、トランザクションレベルでの保証です。 。トランザクションは通常、単一のユニットとして扱われる必要があるクエリのグループです。 MongoDBにはトランザクションの概念がありません。これも、パフォーマンス上の理由 です。 。したがって、ほとんどのACIDプロパティはMongoDBには適用されません。

    A — Atomicityは、トランザクションが成功または失敗する必要があることを示しています。部分的に成功することは許可されていません。トランザクションの一部が失敗した場合は、トランザクション全体をロールバックする必要があります。 MongoDBは、アトミック操作 をサポートしています。 ドキュメントレベルではありますが、「トランザクション」レベルではありません。

    C —一貫性は部分的に原子性を指しますが、参照整合性も含まれます 。リレーショナルデータベースは、すべての外部キー参照が有効であることを確認する責任があります。 MongoDBには外部キーの概念がないため、このACIDプロパティは適用されません。

    —分離では、2つの同時トランザクションが相互に干渉することは許可されていません。 2つのトランザクションが同じデータを変更しようとすると、2番目のトランザクションは最初のトランザクションが完了するのを待つ必要があります。これを実現するために、データベースはデータをロックします。 MongoDBにはロックの概念がないため、複数の分離をサポートしていません。 オペレーション。単一の操作は分離されています。

    D —耐久性は上記のとおりです。 MongoDBは、ACID-icの耐久性に関して、(まだ)真の耐久性をサポートしていません。

    さて、MongoDBはトランザクションがなく、ほとんどのACID保証がないため、RDBMSシステムと比較して役に立たないと思うかもしれません。ただし、トランザクションが存在する理由の一部は、リレーショナルデータベースが特定のデータを単一のエンティティとして扱う必要があるためです。 、ただし、このデータは複数のテーブルに正規化されています 。

    MongoDBを使用すると、データを単一のエンティティとして保存できます。 。これにより、ほとんどの場合、外部キーと参照整合性が不要になります。また、単一のエンティティを更新するために複数のテーブルが必要ないため、マルチクエリトランザクションも必要ありません。ほとんどの場合、更新する必要があるのは1つのドキュメントだけであり、これらの操作はMongoDBではアトミックです。

    このページの最初のコメント によると 、db.eval() 複数の操作を分離します。ただし、ドキュメント 通常、db.eval()の使用は避けたいと思います 。



    1. $exists演算子を使用してフィールドの存在を確認するときにMongoDBはインデックスを使用できますか?

    2. meteorはmongodbにファイルをアップロードします

    3. MongoDBクエリの最適化

    4. mongodb-文字列またはObjectIdを使用してDBRefを構築します