95

私はMySQLやPostgreSQLなどのリレーショナルデータベースを使用することに慣れており、Symfony、RoR、DjangoなどのMVCフレームワークと組み合わせると、うまく機能すると思います。

しかし、最近、非リレーショナルデータベースであるMongoDBについて多くのことを聞きました。または、公式の定義を引用すると、

スケーラブルで高性能なオープンソースのスキーマフリーのドキュメント指向データベース。

私は最先端にいることに本当に興味があり、次のプロジェクトのために私が持っているすべてのオプションを認識し、そこにある最高のテクノロジーを選択したいと思っています。

「クラシック」リレーショナルデータベースを使用するよりも、MongoDB(または同様のデータベース)を使用する方が良い場合はどれですか?そして、MongoDBとMySQLの一般的な利点は何ですか?または少なくとも、なぜそれがそんなに違うのですか?

ドキュメントや例へのポインタがある場合は、それも非常に役立ちます。

4

8 に答える 8

58

Webアプリケーションを構築するためのMongoDBの利点のいくつかを次に示します。

  1. ドキュメントベースのデータモデル。ストレージの基本単位は、JSON、Python辞書、Rubyハッシュなどに類似しています。これは、配列やその他のドキュメントを保持できる豊富なデータ構造です。これは、リレーショナルデータベースで適切に表現するために複数のテーブルを必要とする構造を単一のエンティティで表現できることが多いことを意味します。これは、データが不変である場合に特に役立ちます。
  2. 深いクエリ能力。MongoDBは、SQLとほぼ同じくらい強力なドキュメントベースのクエリ言語を使用して、ドキュメントに対する動的クエリをサポートします。
  3. スキーマの移行はありません。MongoDBはスキーマフリーであるため、コードでスキーマを定義します。
  4. 水平方向のスケーラビリティへの明確な道。

より良いアイデアを得るには、それについてもっと読み、それで遊ぶ必要があります。これがオンラインデモです:

http://try.mongodb.org/

于 2010-01-22T15:27:01.737 に答える
23

多くの利点があります。

たとえば、データベーススキーマはよりスケーラブルになり、移行について心配する必要はありません。コードはより快適に記述できます...たとえば、私のモデルのコードの1つは次のとおりです。

class Setting
  include MongoMapper::Document

  key :news_search, String, :required => true
  key :is_availaible_for_iphone, :required => true, :default => false

  belongs_to :movie
end

キーを追加するのは、コードを1行追加するだけです。

より良いscallabilityとスピードのような、長期的に現れる他の利点もあります。

...ただし、非リレーショナルデータベースはリレーショナルデータベースよりも優れているわけではないことに注意してください。データベースに多くの関係と正規化がある場合、MongoDBのようなものを使用することはほとんど意味がないかもしれません。それはすべて、仕事に適したツールを見つけることです。

詳細については、「Mongoがデータベースに対してRailsがフレームワークに対して何であるかを考える理由」、またはmongodbWebサイトのこの投稿を参照することをお勧めします。ワクワクしてフランス語を話す場合は、MongoDBを最初からセットアップする方法を説明しているこの記事をご覧ください。

編集:ライアンによるこのレールキャストについてあなたに話すのをほとんど忘れていました。とてもおもしろくて、すぐに始めたくなる!

于 2010-01-22T13:21:20.963 に答える
5

スキーマフリーの利点は、負荷が何であれダンプできることであり、誰もそれについて不平を言ったり、間違っていると言ったりする理由がありません。

それはまた、あなたがそれに捨てたものは何でも、あなたがそうした後も完全に意味がないままであることを意味します。

重大な不利益とラベル付けする人もいれば、そうでない人もいます。

リレーショナルデータベースが十分に確立されたスキーマを持っているという事実は、それがデータベースに記録されているものに意味を付けることを可能にする拡張述語の確立されたセットを持っているという事実の結果です。また、そうするために必要な前提条件です。

十分に確立されたスキーマ、拡張述語、および拡張述語がなければ、ユーザーがそこに詰め込まれたものから意味を理解する方法はありません。

于 2010-01-22T23:03:15.617 に答える
3

プロジェクトで両方のデータベースを操作した後のPostgresとMongoの経験。

Postgres(RDBMS)

将来のアプリケーションに多くの結合を必要とする複雑なスキーマがある場合、またはすべてのデータに関係がある場合、または大量の書き込みがある場合は、Postgresをお勧めします。Postgresはオープンソースで、より高速で、ACIDに準拠しており、ディスク上のメモリ使用量が少なく、JSONストレージにも優れたパフォーマンスを発揮し、3レベルのトランザクション分離を備えたトランザクションの完全な直列化可能性を備えています。

Postgresにとどまる最大の利点は、両方の長所があることです。制約、一貫性、速度でデータをJSONBに保存できます。一方、他のタイプのデータにはすべてのSQL機能を使用できます。基盤となるエンジンは非常に安定しており、適切な範囲のデータボリュームに適切に対応します。また、選択したハードウェアとオペレーティングシステムで実行されます。Postgresは、完全なトランザクションサポートとともにNoSQL機能を提供し、フィールドデータに制約のあるJSONドキュメントを保存します。

Postgresの一般的な制約

Postgresを水平方向にスケーリングすることは非常に困難ですが、実行可能です。

Postgresでは高速読み取り操作を完全に実現することはできません。

SQLデータベースはありません

Mongo DB(Wired Tiger)

MongoDBは、「水平スケール」の次元でPostgresを打ち負かす可能性があります。JSONの保存は、Mongoが行うように最適化されていることです。Mongoは、データをBSONbと呼ばれるバイナリ形式で保存します。これは(おおよそ)JSONのスーパーセットの単なるバイナリ表現です。MongoDBは、オブジェクトを設計どおりに格納します。MongoDBによると、書き込みを多用するアプリケーションの場合、Mongoによると、新しいエンジン(Wired Tiger)を使用すると、書き込みパフォーマンスが最大10倍向上し(これを試してみる必要があります)、ストレージ使用率が80%削減され、ストレージのコストを削減できます。 、ハードウェアの利用率を高めます。

MongoDbの一般的な制約

スキーマレスストレージエンジンを使用すると、暗黙的なスキーマの問題が発生します。これらのスキーマは、ストレージエンジンによって定義されるのではなく、アプリケーションの動作と期待に基づいて定義されます。

スタンドアロンのNoSQLテクノロジーは、非構造化アプリケーションの高スループットパフォーマンスを優先して重要なデータ保護を犠牲にするため、ACID標準を満たしていません。NoSQLデータベースにACIDを適用することは難しくありませんが、データベースが遅くなり、ある程度柔軟性がなくなります。「NoSQLの制限のほとんどは、以前の制限を大幅に克服した新しいバージョンとリリースで最適化されました。」

于 2017-03-21T09:17:49.630 に答える
2

トレードオフがすべてです。MongoDBは高速ですが、ACIDではなく、トランザクションがありません。ユースケースによってはMySQLよりも優れており、他のユースケースでは劣っています。

于 2010-01-22T22:15:08.917 に答える
1

MongoDBで書かれたベローライン:決定的なガイド。

いくつかの正当な理由があります:

  1. さまざまな種類のドキュメントを同じコレクションに保持することは、開発者と管理者にとって悪夢になる可能性があります。開発者は、各クエリが特定の種類のドキュメントのみを返すこと、またはクエリを実行するアプリケーションコードがさまざまな形状のドキュメントを処理できることを確認する必要があります。ブログの投稿を照会する場合、作成者データを含むドキュメントを削除するのは面倒です。
  2. コレクション内のタイプのリストを抽出するよりも、コレクションのリストを取得する方がはるかに高速です。たとえば、各ドキュメントが「スキム」、「全体」、「分厚い猿」のいずれのドキュメントであるかを示すタイプキーがコレクションにある場合、1つのコレクションでこれらの3つの値を見つけるのは、 3つの別々のコレクションがあり、それらの名前を照会します
  3. 同じ種類のドキュメントを同じコレクションにグループ化すると、データの局所性が可能になります。投稿のみを含むコレクションから複数のブログ投稿を取得すると、投稿と作成者データを含むコレクションから同じ投稿を取得するよりも、ディスクシークが少なくて済みます。
  4. インデックスを作成するときに、ドキュメントに何らかの構造を課し始めます。(これは、一意のインデックスの場合に特に当てはまります。)これらのインデックスはコレクションごとに定義されます。単一のタイプのドキュメントのみを同じコレクションに入れることで、コレクションのインデックスをより効率的に作成できます
于 2013-07-01T13:06:17.933 に答える
0

テキストストレージを備えたデータベースについて質問した後、MongoDBや同様のシステムを一瞥しました。
私が正しく理解していれば、それらは使いやすくセットアップが簡単で、はるかに高速であるはずです。SQLがないためSQLインジェクションが妨げられるため、おそらくより安全です...
どうやら、MongoDBは主にWebアプリケーションに使用されています。
基本的に、これらのデータベースは複雑なクエリやデータマイニングなどには適していないと述べています。しかし、フラットなデータをすばやく取得することに優れています。

于 2010-01-22T13:21:50.230 に答える
0
  1. MongoDBは、フィールドによる検索、正規表現検索をサポートしています。ユーザー定義のJavaスクリプト関数が含まれています。
  2. MongoDBはファイルシステムとして使用でき、ファイルを保存するために複数のマシンで負荷分散とデータ複製機能を利用します。
于 2013-12-18T06:02:34.730 に答える