web-dev-qa-db-ja.com

SQLサーバーからMongoDBに移行する理由と反対する理由

これは大きな問題であり、はいかいいえの答えではありませんが、Webアプリを開発しており、永続化ソリューションにMongoDBを使用することを検討しています。オブジェクトストレージのためにMongoDBとNoRMを組み合わせる。

SQLからmongoへの切り替えで経験した落とし穴は何ですか? mongoが単に適切なソリューションではなく、mongodbの利点が開発をSQLから移行するのに十分なのはいつですか?

47
Richard

私の意見では、データのフォーマットは、ストレージバックエンドを選択する際の主要な関心事であるはずです。本質的にリレーショナルなデータはありますか?もしそうなら、それは可能ですか?ドキュメントのデータをモデル化することは良い考えですか?データモデリングは、リレーショナルデータベースと同様にドキュメントデータベースでも重要です。オブジェクトのタイプはいくつありますか、またそれらはどのように関連していますか? MongodbのDBrefsがそのトリックを実行できますか、それとも痛みを伴うほどに外部キーを逃しますか?データへのアクセスパターンは何ですか?フィールド値でフィルタリングされた1つのタイプのデータをフェッチするだけですか、それとも複雑なフェッチモードがありますか?

ACIDトランザクションの整合性が必要ですか?ドメインはデータに多くの制約を課していますか?ドキュメントデータベースのスケーラビリティファクターが必要ですか、それとも単なる "クール"なものでしょうか。

整合性とデータ整合性の要件は何ですか?一部のNoSQLソリューション、特にMongoDBでは、パフォーマンスを得るために、書き込みの一貫性がかなり緩くなっています。 NoSQLは、画一的なランドスケープやその他の製品ではありません。 CouchDBにはこの部門の他の特徴があります。調整可能なものもあります。

これらはすべて、ストレージの選択に関する質問です。

いくつかの経験

  • MongoDBまたは任意のドキュメントデータベースを使用する場合、格納されたデータに関する広範なレポートを作成することは困難になる可能性があり、RDBMSとdocument-dbを組み合わせて使用​​するケースもあります。
  • (非常に)異なるクエリモデル。 MongoDBは他のdocument-dbとも異なります。
  • 開発中にデータ形式/スキーマを変更する柔軟性
  • 不明な地域
  • ドライバーとフレームワークの成熟度の違い
  • 速い
  • よりシンプルな(多くの点で)製品および管理ツール(多くのRDBMS製品と比較して)
  • インピーダンスの不整合はなくなりました。ストレージはデータに適合し、その逆ではありません。
  • 摩擦が少なく、データに直接アクセスできます。
  • ドメインは永続性により結びついています(NoRMのORMの「レベル」に応じて、バックエンドをどれだけ抽象化するかに依存します。NoRMを使用していないので、答えられません)。
35
Knut Haugen

短所

  1. (耐久性の欠如/上の異なるビジョン)耐久性(読み取り http://www.mikealrogers.com/2010/07/mongodb-performance-durability
  2. 取引なし
  3. 制約なし
  4. MapReduceでの集約は遅く、group-byなどのコードを記述する必要があります
  5. レポートはより難しく、開発者は関係を定義しますが、ビジネスアナリストは独自のクエリを作成できません。たとえば、「マイナス」を行うことはできません(SQLサーバーの用語では「例外」)

長所

  1. 新しい「列」と「テーブル」を簡単に追加できます
  2. 速度
  3. シャーディング(まだベータ版)
  4. ドキュメントは、リレーショナルテーブルのセットよりもオブジェクトに密接に一致するため、マッピングが容易になります
  5. それは心を広げます
7
TTT

私は数日それをいじり続けています。これは私がそれについて言えることです:

ために:

  • SQLステートメントは不要
  • データベースはクラスと似ていますが逆ではありません
  • 「スキーマ」はより柔軟です
  • うまくスケーリング
  • 始めるのは非常に簡単
  • <意見>かっこいい</意見>

に対して:

  • 現在、mongoアプリにカスタムメンバーシッププロバイダーとロールプロバイダーを実装しようとしていますが、mongoから取得しようとすると、なんとかしてMemberShipユーザークラスにNULLフィールドが含まれます。
  • C#ドライバーについてどこかで読んだことがありますが、C#ドライバーは比較的新しいが安定しているため、いくつかの変更が予想されます。 (これは私を止めることはできませんが)

チュートリアルから欠落していることに気付いた1つのこと:オブジェクト内でリストを初期化します。そうしないと、.save(yourobj)を試行中にエラーがスローされます。最も安全な方法は、クラス内にコンストラクターを記述して、オブジェクト内にNULLオブジェクトがないことを確認することです。これにより、何かを忘れてもエラーになりません。

5
Sjuul Janssen

Graph comparing speed to update records

マイレージは異なる場合がありますが、これは、複数の「テーブル行」(MongoDBの非階層フラットドキュメント)の更新速度を比較するためにまとめた簡単なグラフです。私たちのアプリケーション。

5
GroovyCakes

この Getting Started with NoSQL には、NoSQLデータベース(MongoDBを含む)を使用する場合の長所と短所がいくつかあります。簡単な要約は次のようになります:異なるデータモデル(オブジェクトモデルから「この新しいモデル」へのマッピングが必要かどうかを考え、うまく機能します)、異なるクエリモデル(MongoDBクエリは他のものと比較するとかなり可能です) 、トランザクションなし(ただし、いくつかのアトミック操作があります)。

とにかく、私の観点から最も重要な変更は、データモデルと、この新しいアプローチでアプリを設計する方法です。

2
alexpopescu

AWSのAtlasクラウドで実行されているMongoDBを何ヶ月も使用してきましたが、2つの大きなメリットが際立っています。

  • リレーショナルデータベースと比較して、途方もなく高速です。ヨーロッパ間の往復を含め、ドキュメントが15ミリ秒を超えて返されることはほとんどありません。
  • スキーマや非正規化を気にすることはやめました。C#オブジェクトのドミアンモデルを取得してデータベースにシリアル化するだけで、かなりうまくいくようです。
0
alastairtree