2011-07-26 10 views
1

私は結果を格納するためにバッキングデータベースを必要とするシミュレーションを書いています。シミュレーションは大量のデータを書き込みます。明らかなパフォーマンス上の理由から、私はNoSQLデータベース、特にMongoDBを試してみました。しかし、私は自分のデータモデルに少し戸惑っています。MongoDBスキーマ設計 - 参照と埋め込み

リレーショナルの世界では、スキーマはこれに翻訳します:

Relational data model

  1. シミュレーション
  2. シナリオは、特定のシミュレーションケースを記述するなど、シミュレーションの設定、ステータスを保持しています。
  3. 実現グループTestResults。

シミュレーションは次のように動作します。まず、コンフィギュレーション(シミュレーションテーブルへのマップ)を作成し、シナリオと計算するRealizationの数を指定します。次に、シミュレーションを開始します。シミュレーションは、シナリオで実現を作成します(並行して、多くの実現と同時に計算され、シミュレーションが現在実行しているシナリオに挿入されます)。

しかし、NoSQL、特にMongoDBではリレーションが悪く遅いので、できるだけ埋め込みドキュメントを活用する必要があります。だから私はこの思い付いた:

Embedded data model

このモデルは私の最初のすべての実現を計算し、THEN(シナリオの)単一のインサートとしてデータベースに保存する最高のパフォーマンスを与える必要があります。

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

Realizationをシナリオに埋め込むのではなく、それを参照する方が速いでしょうか?あとでデータを読み込んだり集計すると、どれくらいのパフォーマンスが失われますか?私が知るべき他の落とし穴?

ありがとうございました。

答えて

1

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

埋め込みドキュメントの最大サイズに達するなどの潜在的な制限を除けば、どのような種類のパフォーマンスがシナリオにとってより重要になっているかが分かります。

0

レコードを更新する場合は、たとえばユーザーが埋め込まれている場合(友だちと言えば) など、ユーザーの1人のユーザーの名前を変更するとコレクションの全友人リストを繰り返し、手動で自分の名を更新する必要があります。

関連する問題