sql >> Databáze >  >> NoSQL >> MongoDB

Navrhování vztahů Many-to-Many v MongoDB (místo relačních tabulek)

Toto je případ, kdy jsou data ve vztahu Many-to-Many. Myslím, že ve vaší databázi je několik tisíc studentů a několik stovek kurzů.

Pro začátek mohu použít následující návrh s podrobnostmi o kurzu vloženými s každým studentem jako řadu dílčích dokumentů nazývaných courses .

- students collection
id:
name:
courses: [ { id: 1, name: },  { id: 5, name: }, ... ]

- courses collection
id:
name:
description:

Všimněte si, že ID a název kurzu jsou uloženy v obou kolekcích. Jedná se o duplikaci dat. To by mělo být v pořádku, protože duplicitní detaily se často nemění (nebo se nemusí měnit vůbec).

Dotaz na všechny kurzy, do kterých je student zapsán, například:db.students.find( { name: "John" } ) . Tím se vrátí jeden studentský dokument s odpovídajícím jménem a všemi kurzy (pole pole). Viz db.collection.find .

Zeptejte se všech studentů zapsaných do konkrétního kurzu:db.students.find( { "courses.name": "Java Programming" } ) . Tím se vrátí všechny dokumenty studentů, jejichž název kurzu odpovídá kritériím „programování v jazyce Java“. Viz Dotaz na pole vložených dokumentů .

Dále můžete použít projekci vyloučit a zahrnout pole z výsledku.

POZNÁMKY:

  • Informace o studentech můžete vložit do kolekce kurzů namísto kurzů do studentů. Dotazy budou podobné výše uvedeným, ale budete se dotazovat na kolekci kurzů. Záleží na vašem případu použití.
  • Pole ID kurzu můžete pouze uložit do pole kurzů v kolekci studentů; to je případ, kdy se pole názvu kurzu často mění. Dotazy budou používat agregaci $lookup (operace „připojit se“) k získání kurzu a z kolekce kurzů.
  • Informace o Návrhu datového modelu pro data MongoDB založená na dokumentech.



  1. MongoDB odlišná agregace

  2. MongoDB $ rozsah

  3. Je bezpečné odstranit soubor deníku mongodb?

  4. Vyhněte se Aggregate 16MB Limit