web-dev-qa-db-ja.com

このクイズエンジンシナリオに推奨されるMongoDBスキーマは何ですか?

私は外国語を学ぶためのクイズエンジンに取り組んでいます。エンジンはユーザーに4つの画像を同時に表示し、音声ファイルを再生します。ユーザーは音声と正しい画像を一致させる必要があります。以下は、MongoDBのドキュメント構造です。各ドキュメントは、画像ファイル参照と、その画像に一致するオーディオファイルへの参照の配列で構成されます。クイズインスタンスを生成するには、4つのドキュメントをランダムに選択し、画像を表示して、4つのドキュメントから1つのオーディオファイルをランダムに再生します。

アプリケーション開発の次のステップは、ユーザーの推測を保存するのに最適なドキュメントスキーマを決定することです。考慮すべき要件がいくつかあります。

  1. ユーザーレベルで統計を報告できる必要があります。たとえば、正解の合計、推測の合計、平均精度など)
  2. ユーザーの学習の進捗状況に基づいて画像を照会できる必要があります。たとえば、推測数が10を超え、精度が0.50未満の4つのドキュメントを選択します。
  3. スキーマは、クイズを迅速に生成するために最適化する必要があります。
  4. スキーマは、ドキュメントサイズに対して将来のスケーリングの問題を引き起こしてはなりません。平均1000推測を行う1mmユーザーを想定します。

これらすべてを背景情報として、推奨されるスキーマは何でしょうか?たとえば、各推測を画像ドキュメントに保存するか、ユーザードキュメント(図には表示されていません)または推測をログに記録するために作成された新しいドキュメントコレクションに保存しますか?生の推測データをログに記録することをお勧めしますか、それとも関連ドキュメント内のカウンターを増分して統計を事前計算しますか?


画像コレクションのスキーマ:

_id "505bcc7a45c978be24000005"      

date    2012-09-21 02:10:02 UTC     
imageFileName   "BD3E134A-C7B3-4405-9004-ED573DF477FE-29879-0000395CF1091601"       
random  0.26997075392864645     
user    "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF"
audioFiles  
[
0   
{
audioFileName   "C3669719-9F0A-4EB5-A791-2C00486665ED-30305-000039A3FDA7DCD2"
user    "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF"
audioLanguage   "English"
date    2012-09-22 01:15:04 UTC
}
1   
{
audioFileName   "C3669719-9F0A-4EB5-A791-2C00486665ED-30305-000039A3FDA7DCD2"
user    "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF"
audioLanguage   "Spanish"
date    2012-09-22 01:17:04 UTC
}
]
3
hughesdan

各推測を個別のドキュメントとしてユーザー推測コレクションに保存します。各ドキュメントの構造は次のようになります。

Guess
- userId
- selectedImageId
- correctImageId

表示された画像や再生された音声など、対応するクイックに関する詳細情報を保存することもできます。統計を生成するには、このコレクションに対して Map/Reduce を実行する必要があります。たとえば、推測の合計と正しい推測を取得するには、Map/Reduce出力ドキュメントの構造は次のようになります。

UserStats
- userId
- guesses
- correct

Map関数は次のようになります。

function() {
    emit(this.userId, { guesses: 1, correct: this.selectedImageId === this.correctImageId ? 1 : 0 });
}

そして還元関数:

function(key, values) {
  var result = { userId = key, guesses: 0, correct: 0 };
  values.forEach(function(value) {
    result.guesses += value.guesses;
    result.correct += value.correct;   
  });
  return result;
}

MongoDBでは、ソースコレクションが更新されるときにMap/Reduceが自動的に実行されないため、自分で実装する必要があることに注意してください。

2
eulerfx