MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment la relation plusieurs à plusieurs suivante doit-elle être modélisée dans MongoDB ?

Voici quelques considérations. Au final, cela dépend de vos besoins :

  1. L'évaluation est facultative, n'est-ce pas ?

    Si c'est le cas, demandez-vous si vous souhaitez combiner une fonctionnalité obligatoire (stocker l'association enseignant/élève) avec une fonctionnalité intéressante. Le code qui implémente une fonctionnalité intéressante écrit désormais dans votre collection la plus importante. Je pense que vous pouvez améliorer la séparation des problèmes dans votre code avec un schéma de base de données différent.

  2. Aurez-vous besoin de plus de fonctionnalités ?

    Supposons que vous souhaitiez fournir aux étudiants une liste des notes qu'ils ont attribuées, la note moyenne qu'un étudiant a attribuée aux enseignants et que vous souhaitiez montrer l'évolution des notes au fil du temps. Ce sera très salissant avec les documents intégrés. Les documents intégrés sont moins flexibles .

  3. Si vous avez besoin de performances de lecture optimales, vous devez dénormaliser davantage de données

    Si vous souhaitez vous en tenir aux documents intégrés, vous souhaiterez peut-être copier davantage de données. Disons qu'il y a un aperçu des notes par enseignant où vous pouvez voir les noms des élèves. Il serait utile d'intégrer un objet

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

En guise d'alternative, envisagez

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

L'association enseignant/élève sera toujours stockée dans l'objet enseignant, mais les évaluations se trouvent dans des collections différentes. Une évaluation ne peut pas être créée si aucune association entre l'enseignant et l'élève ne peut être trouvée.

ou

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

Pour trouver tous les élèves d'un enseignant donné, vous devez d'abord interroger le document de l'éditeur de liens, puis faire un $in interroger les élèves, et vice versa. C'est une requête de plus, mais elle s'accompagne d'un énorme gain de flexibilité.