MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come dovrebbe essere modellata la seguente relazione da molti a molti in MongoDB?

Ecco alcune considerazioni. Alla fine, dipende dalle tue esigenze:

  1. La valutazione è facoltativa, giusto?

    Se è così, chiediti se vuoi combinare una funzionalità richiesta (memorizzazione dell'associazione insegnante/studente) con una piacevole da avere. Il codice che implementa una caratteristica utile ora scrive nella tua raccolta più importante. Penso che tu possa migliorare la separazione dei problemi nel tuo codice con uno schema db diverso.

  2. Avrai bisogno di più funzioni ?

    Supponiamo che tu voglia fornire agli studenti un elenco delle valutazioni che hanno assegnato, la valutazione media che uno studente ha assegnato agli insegnanti e che desideri mostrare uno sviluppo delle valutazioni nel tempo. Questo sarà molto disordinato con i documenti incorporati. I documenti incorporati sono meno flessibili .

  3. Se hai bisogno delle massime prestazioni di lettura, devi denormalizzare più dati

    Se vuoi attenerti ai documenti incorporati, potresti voler copiare più dati. Diciamo che c'è una panoramica delle valutazioni per insegnante in cui puoi vedere i nomi degli studenti. Sarebbe utile incorporare un oggetto

    { studentId : ObjectId, 
      rating: string, 
      studentName: string, 
      created: dateTime }
    

In alternativa, considera

TeacherRating {
    StudentId: id
    TeacherId: id
    Rating: number
    Created: DateTime
}

L'associazione insegnante/studente sarà ancora archiviata nell'oggetto insegnante, ma le valutazioni sono in una raccolta diversa. Non è possibile creare una valutazione se non viene trovata alcuna associazione tra insegnante e studente.

o

TeacherStudentClass {
    StudentId: id
    TeacherId: id
    Class: id
    ClassName: string // (denormalized, just an example)
    Rating: number // (optional)
    Created: DateTime
}

Per trovare tutti gli studenti per un determinato insegnante, dovresti prima interrogare il documento linker, quindi fare un $in interrogazione sugli studenti e viceversa. Questa è un'altra domanda, ma offre un enorme vantaggio in termini di flessibilità.