22

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

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

バックボーン、ノード、mysql(またはmongo)を使用してビルドされたサンプルアプリケーション(ソース付き)へのリンクを誰かに教えてもらえますか?または少なくともアプリ。Nodeとmysqlを使用

ありがとう

4

3 に答える 3

43

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

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

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

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

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

于 2012-04-11T16:45:52.920 に答える
12

また、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内のドキュメント全体のプレビューとメタデータを保存します。

于 2013-01-26T13:08:41.360 に答える
8

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

  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/

于 2012-04-11T17:31:03.570 に答える