web-dev-qa-db-ja.com

どのデータベースが私のアプリケーションmysqlまたはmongodbに適していますか? Node.js、Backbone、Now.jsを使用

フロントエンド:バックボーンバックエンド:ノードを使用して、docs.google.comのようなアプリケーション(APIなし、完全に自分のサーバー上)を作成したい

どのデータベースが優れていると思いますか? mysqlまたはmongodb?優れたスケーラビリティをサポートする必要があります。私はphpを使用したmysqlに精通しており、答えがmysqlであれば満足しています。しかし、私が見た多くのチュートリアルでは、mongodbを使用していましたが、なぜmysqlなしでmongodbを使用したのですか?何を使うべきですか?

誰かがバックボーン、Node、mysql(またはmongo)、または少なくともapp。withNode and mysql

ありがとう

17
user1305989

MongoDBを使用すると、store JSONオブジェクトを取得して完全な形式で取得できるため、ORMレイヤーは実際には必要なく、データのやり取りに費やすCPU時間も少なくて済みます。 MongoDBの背後にいる開発者は、データベースの水平スケーリングの優先度を高くし、任意のJavascriptコードを実行して、DB側でデータを前処理できるようにしました(データのmap-reduceスタイルのフィルタリングを可能にします)。

しかし、これらの利益のためにいくつかを失います:レコードに参加することはできません。実際、保存するJSON構造は、SQLの結合を介してのみ実行できますが、MongoDBでは、データに対してその1つの構造しかありませんが、SQLでは、異なるクエリを実行して、データを別の方法でより簡単に表現できます。データベースで多くの分析を行う必要がある場合、MongoDBはそれを難し​​くします。

私の意見では、MongoDBのクエリ言語は、SQLよりも「ラフ」です。これは、一部は使い慣れていないため、一部はクエリ機能が無計画に組み合わされて、一部は有効なJSONになるため、一部は文字通り同じことを行ういくつかの方法があり、いくつかは他の方法ほど有用ではないか、定期的にフォーマットされていない古い方法です。また、SQLの単純な行ベースの設計に比べて配列とサブオブジェクトの種類が複雑になるため、構文は、定義した値のsomeを含む配列のクエリを処理できる必要があります。 all定義した値の、only定義した値、およびnoneの定義した値を含みます。同じ区別がオブジェクトキーとその値にも当てはまり、これによりクエリ構文が理解しにくくなります。 (そして、エッジケースの必要性はわかりますが、$whereクエリパラメータは、データのすべてのレコードで実行され、ブール値を返すjavascript関数を受け取ります。これは、返すオブジェクトを簡単に定義できるため、サイレンの曲ですが、実行する必要があります- すべてデータベースのレコード。インデックスは使用できません。)

ですから、何をしたいかにもよりますが、Google Docsクローン用だと言っているので、おそらく表現は気にしないしかしドキュメント表現、それ自体、そしてあなたはおそらくドキュメントID、ドキュメント名、または所有者のID /名前に基づいてクエリを実行するだけで、クエリはそれほど複雑ではありません。

次に、ユーザーが編集しているドキュメントのJSON表現を取得し、それをデータベースにスローして、これらの重要なフィールドに自動的にインデックスを付けることができるので、新しいデータベースを学習する価値があります。

39
user1207456

また、MongoDBを使用して作成されていないタスクに誇大広告を表示することで、この選択に苦労していました。だから私の2セントは:

  1. Davidが言うように、MongoDBでは、ドキュメントと思われる階層オブジェクトの保存と取得が簡単です。ただし、16Mbを超えるドキュメントを保存する場合は、さらに複雑になります。MongoDBの答えはGridFSです。

  2. フォルダー、グループでドキュメントを整理し、どのユーザーがどのドキュメントを所有し、誰がそれらへのアクセスを提供したかを追跡することは、MySQLを使用すると間違いなく簡単になります-EXPLAIN最適化、トリガー、関数、ストアドプロシージャなど。MongoDBはどこにもありません。

では、MySQLを使用してドキュメントを整理することとMongoDBを使用してidで識別されるドキュメントの1つのコレクション(または複数のコレクション-ドキュメントタイプごとに1つ)を保存することを妨げるものは何ですか?私には最良の選択のように思われ、1つのアプリケーションで2つのデータベースを使用することは実際には問題ではありません。

MySQLは、ユーザー、グループ、フォルダー、パーミッション(好きなものは何でも)を保存し、ドキュメントごとに、コレクションとドキュメントIDへの参照を保存します(MongoDBには特別な形式(DBRefs)があります)。 MongoDBは、ドキュメントがすべて16MB未満の場合、コレクションにドキュメント自体を保存します。コレクション内のドキュメントとGridFS内のドキュメント全体のプレビューとメタデータを保存します。

11
esp

デビッドは良い答えを提供しました。それに追加するいくつかのこと。

  1. MongoDBの柔軟な性質により、アジャイル/反復型開発が容易になります。
  2. Node.jsのようなMongoDBは本質的に非同期であり、非同期環境内で非常にうまく機能します。
  3. Mongooseは、Node.jsでMongoDBを操作するのが非常に自然な感じになる優れたODM(オブジェクトドキュメントマッパー)です。 ORMとは異なり、これは非常に薄い層です。

Google Docのような機能の場合、MongoDBによって提供される柔軟性と非常に豊富なデータ構造がはるかに適しているように感じます。

Mongoose、node、MongoDBを検索すると、いくつかの良い例の投稿を見つけることができます。

これもbackbone.jsを使用していて、見栄えが良いものです http://mattkopala.com/blog/2012/02/12/getting-started-with-nodejs/

7
Steve Francia