6

NoSQLタイプのデータベース、特にMongoDBについて質問がありますが、一般的に、ほとんどのKey-Valueまたはドキュメントベースのストレージに適用されます。NoSQLのセールスポイントのいくつかは速度とスケーラビリティですが、リレーショナルデータベースと比較してかなりのオーバーヘッドがあるように思われます。

  1. (ほとんど)すべてが正規化されていないため、重複がたくさんあります。これはそのようなデータベースの一種のポイントであるため、それについて多くを行うことはできません。私は次のものについてもっと心配しています:

  2. JSONドキュメントがある場合は、各ドキュメントにすべてのキー(およびすべての構造情報)を保存する必要があるため、多くのオーバーヘッドがあります。したがって、10000行の場合、文字列'age'、'name'、...を10000回保存する必要があります。

  3. データベースは、インデックスやバイナリツリーの作成(時間を節約するため)や整数のコンパクトな保存(自由形式のドキュメントの1つに文字列が含まれ、他のすべてのドキュメントにintが含まれる可能性があるため)など、多くの巧妙な処理を実行できません。等。)

独自のビューまたはmap/reduceアルゴリズムを記述して、インデックスのようなものを取得できることは知っていますが、一般的なケースでは、NoSQLはスペースとCPUの面で非常に非効率的である必要があります。

本当にそんなに悪いの?NoSQLデータベース(MongoDBなど)ではどのような最適化が行われていますか?リレーショナルデータベースを使用する場合と比較して、同一の複雑なJSONドキュメントを多数保存する場合のオーバーヘッドはどれくらいですか?

4

1 に答える 1

1

まず、オーバーヘッドや非効率性は、多くの場合、単に優先順位の選択を表しているだけではありません。どこかにオーバーヘッドがあると、どこかで有利になります。

具体的なポイントについては、キー値またはドキュメントベースのサブグループであっても、正確なNoSQL製品に応じて答えが大きく異なると思いますが、ここでいくつかの考えがあります:

1-(ほとんど)すべてが正規化されていないため、多くの重複があります。これはそのようなデータベースのポイントのようなものであるため、それについて多くを行うことはできません.

実際、ほとんどの (すべてではないにしても) キー値データベースは、任意のスキーマで使用できます。そのため、キー値ストアに「正規化されたスキーマ」を配置できるため、重複がなくなります。一部の (またはほとんどの?) キー値データベースで使用できる SQL ソリューションがあることを忘れないでください。

2- JSON ドキュメントがある場合、各ドキュメントですべてのキー (およびすべての構造情報) を保存する必要があるため、多くのオーバーヘッドがあります。したがって、10000 行の場合、文字列 'age'、'name'、... を 10000 回保存する必要があります。

これはデータベースエンジンの実装方法に依存すると思いますが、複雑なまたは単純な「トークン化」のいずれかの圧縮を使用しても、大きなオーバーヘッドは発生しません。

3- データベースは、インデックスやバイナリ ツリーの作成 (時間を節約するため) や、コンパクトな方法での整数の格納など、多くの巧妙なことを行うことができません (自由形式のドキュメントの 1 つが文字列を持ち、他のすべてのドキュメントがint など)

繰り返しますが、キー値またはドキュメントベースのデータベースが内部であらゆる種類のツリーを使用したり、整数をコンパクトな方法で格納したりすることを妨げるものは何もありません (たとえば、データが文字列として格納されているかどうかを示す単純なバイナリ フラグを持つことができます)。または「コンパクト整数」)。インデックスの作成に関しては、それも可能です (1 で述べたのと同じ理由で、またはアプリケーションによって手動で行われます)。

于 2012-08-30T15:06:23.247 に答える