Questo è il caso di avere i dati con una relazione Molti-a-Molti. Penso che nel tuo database ci siano poche migliaia di studenti e qualche centinaio di corsi.
Per cominciare, posso usare il seguente design con i dettagli del corso incorporati in ogni studente come una matrice di documenti secondari chiamati courses
.
- students collection
id:
name:
courses: [ { id: 1, name: }, { id: 5, name: }, ... ]
- courses collection
id:
name:
description:
Nota, l'ID e il nome del corso sono memorizzati in entrambe le raccolte. Questa è la duplicazione dei dati. Questo dovrebbe andare bene, poiché i dettagli duplicati non cambiano spesso (o potrebbero non cambiare affatto).
Interroga tutti i corsi a cui è iscritto uno studente, ad esempio:db.students.find( { name: "John" } )
. Questo restituirà un documento studente con il nome corrispondente e tutti i corsi (il campo dell'array). Vedi db.collection.find
.
Interroga tutti gli studenti iscritti a un determinato corso:db.students.find( { "courses.name": "Java Programming" } )
. Questo restituirà tutti i documenti degli studenti che hanno il nome del corso che corrisponde ai criteri "Programmazione java". Vedere Richiedere una serie di documenti incorporati
.
Inoltre, puoi utilizzare la proiezione escludere e includere campi dal risultato.
NOTE:
- Puoi incorporare le informazioni sugli studenti nella raccolta dei corsi, invece dei corsi negli studenti. Le query saranno simili a quelle precedenti, ma interrogherai la raccolta dei corsi. Dipende dal tuo caso d'uso.
- Puoi semplicemente memorizzare il campo dell'id del corso nell'array dei corsi, della collezione degli studenti; questo è il caso in cui il campo del nome del corso cambia spesso. Le query utilizzeranno l'aggregazione $lookup (un'operazione di "partecipazione") per ottenere il corso e dalla raccolta dei corsi.
- Informazioni su Progettazione di modelli di dati per dati MongoDB basati su documenti.