1

私は高度に正規化されたデータモデルを持っています。_id現在、最も深いコレクションから詳細を取得するために、 を保存して順次クエリを実行することにより、手動参照を使用しています。

参照は一方向で、フローには約 5 ~ 6 個のコレクションがあります。ある特定の使用例では、上位レベルのコレクションから後続の「_id」を照会して、最も深いコレクションまで照会する必要があります。技術的には、実行するたびにデータベースにアクセスしています

db.collection_name.find(_id: ****). 

私の主な目標は、他のコレクションの原子性に大きな影響を与えずに読み取りを最適化することです。非正規化について読んだことがありますが、カーディナリティを変更するオプションを維持したいので、別のコレクションを完全に維持したいので、意味がありません。

私は当初、MapReduce を使用して後方から集計を行い、主に特定のユース ケース用のコレクションを作成することを考えていました。しかし、それでもそれほど良い音ではありません。

リレーショナル データベースでは、クエリをサブクエリに分割し、結合を実行して、最初の結果と交差するデータ セットを取得します。mongodb は結合をサポートしていないため、何かを理解するのに苦労しています。

以前にこのような問題に直面したことがある場合、または解決方法を知っている場合は、助けてください。

4

1 に答える 1

2

データを非正規化します。

MongoDB は JOIN の - ピリオドを実行しません。

複数のコレクションからデータを取得するデータベース操作はありません。ないfind()、ないaggregate()、ないMapReduce。複数のコレクションからのデータを一緒にパズルする必要がある場合、アプリケーション層でそれを行う以外に方法はありません。そのため、1 つのコレクションのみをクエリすることで、パフォーマンスに関連する一般的なクエリを解決できるように、データを整理する必要があります。

そのためには、冗長性と推移的な依存関係を作成する必要がある場合があります。これは MongoDB では正常です。

これが「汚い」と感じる場合は、パフォーマンスが最適ではないという事実を受け入れるか、従来のリレーショナル データベースやグラフ データベースなどの別の種類のデータベースを使用する必要があります。

于 2015-07-15T08:43:35.247 に答える