Qual è lo schema MongoDB consigliato per questo scenario del motore di quiz?

3

Sto lavorando a un motore di quiz per l'apprendimento di una lingua straniera. Il motore mostra agli utenti quattro immagini contemporaneamente e quindi riproduce un file audio. L'utente deve abbinare l'audio all'immagine corretta. Di seguito è riportata la struttura del documento MongoDB. Ogni documento è costituito da un riferimento di file immagine e una serie di riferimenti a file audio che corrispondono a quell'immagine. Per generare un'istanza di quiz seleziono quattro documenti a caso, mostro le immagini e poi riproduco a caso un file audio tra i quattro documenti.

Il prossimo passo nello sviluppo delle mie applicazioni è decidere il miglior schema del documento per la memorizzazione delle ipotesi utente. Ci sono diversi requisiti da considerare:

  1. Devo essere in grado di segnalare le statistiche a livello di utente. Ad esempio, risposte corrette totali, ipotesi totali, accuratezza media, ecc.
  2. Devo essere in grado di interrogare le immagini in base ai progressi di apprendimento dell'utente. Ad esempio, seleziona 4 documenti in cui il conteggio delle ipotesi è > 10 e la precisione è < = 0,50.
  3. Lo schema deve essere ottimizzato per la generazione rapida di quiz.
  4. Lo schema non deve causare problemi di ridimensionamento futuri rispetto alle dimensioni del documento. Assumi utenti da 1 mm che fanno una media di 1000 ipotesi.

Considerato tutto questo come informazioni di base, quale sarebbe lo schema consigliato? Ad esempio, memorizzerai ogni ipotesi nel documento Immagine o forse in un documento Utente (non mostrato) o in una nuova raccolta di documenti creata per le ipotesi di registrazione? Consiglieresti di registrare i dati grezzi di ipotesi o calcoleresti le statistiche incrementando i contatori all'interno del documento pertinente?

Schema per la raccolta di immagini:

_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
}
]
    
posta hughesdan 02.10.2012 - 18:11
fonte

1 risposta

2

Memorizzerei ogni ipotesi come un documento separato in una raccolta di ipotesi utente. La struttura di ciascun documento sarebbe la seguente:

Guess
- userId
- selectedImageId
- correctImageId

Puoi anche memorizzare più informazioni sul rapido corrispondente, come le immagini mostrate e l'audio riprodotto. Per generare statistiche, devi eseguire Mappa / Riduci su questa raccolta. Ad esempio, per ottenere statistiche di ipotesi totali e corrette, la struttura del documento di output Map / Reduce sarà:

UserStats
- userId
- guesses
- correct

La funzione mappa potrebbe essere simile a questa:

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

E la funzione di riduzione:

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;
}

Nota, su MongoDB, Map / Reduce non viene eseguito automaticamente man mano che le raccolte di origini vengono aggiornate, quindi dovrai implementarlo da solo.

    
risposta data 05.10.2012 - 01:57
fonte

Leggi altre domande sui tag