1

結果を保存するためのバッキング データベースを必要とするシミュレーションを作成しています。シミュレーションは大量のデータを書き込みます。明らかなパフォーマンス上の理由から、NoSQL データベース、特に MongoDB を試すことにしました。ただし、データ モデルについては少し戸惑っています。

リレーショナルの世界では、スキーマは次のように変換されます。

リレーショナル データ モデル

  1. シミュレーションには、シミュレーションの構成、ステータスなどが保持されます。
  2. シナリオでは、特定のシミュレーション ケースについて説明します。
  3. 実現グループ TestResults。

シミュレーションは次のように動作します。最初に、構成 (シミュレーション テーブルへのマップ) を作成し、シナリオと、計算する実現の数を指定します。それではシミュレーションを開始します。シミュレーションは、シナリオで実現を作成します (並行して、非常に多くの実現が同時に計算され、シミュレーションが現在取り組んでいるシナリオに挿入されます)。

ただ、NoSQL、特にMongoDBはリレーションが悪くて遅いので、埋め込みドキュメントを極力活用したい。だから私はこれを思いついた:

埋め込みデータ モデル

このモデルは、最初にすべての実現を計算し、それを (シナリオの) 単一の挿入としてデータベースに保存するときに、最高のパフォーマンスを発揮するはずです。

ただし、パフォーマンス上の理由から、計算されたらすぐに実現をシナリオに挿入したいと考えています。これは、実現が完了するたびにシナリオを更新する必要があります。これは悪い考えですか?MongoDB のリファレンスでは、埋め込みドキュメントを親ドキュメントに追加すると、親ドキュメントは更新されますが、とにかくパフォーマンスが低下すると書かれています。

Realization を Scenario に埋め込まずに参照した方が速いでしょうか? 後でデータを読み取って集計すると、どの程度のパフォーマンスが失われますか? 私が知っておくべき他の落とし穴はありますか?

ありがとう。

4

2 に答える 2

2

データをどのように使用するかによって異なります。埋め込みには複数のドキュメントの更新が含まれる可能性があるため、書き込みは遅くなりますが、読み取りは常に 1 つのドキュメントのみなので高速になります。参照はその逆です。単一のドキュメントに書き込む (高速) が、複数のドキュメントを読み取る (低速)。

埋め込みドキュメントの最大サイズに達するなどの潜在的な制限は別として、シナリオにとってどのタイプのパフォーマンスがより重要かということになります。

于 2011-07-29T08:12:24.227 に答える
0

考慮すべきもう1つのことは、レコードを更新する場合です。たとえば、ユーザーのリスト(友達としましょう)が埋め込まれている場合、ユーザーコレクション内のユーザーの1人の名前を変更する場合、反復する必要があります友達リスト全体を削除し、名前を手動で更新します。

于 2013-07-21T05:16:03.237 に答える