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

Progettazione di relazioni Molti-a-Molti in MongoDB (anziché tabelle relazionali)

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.