Relations avec MongoDB

Relations avec MongoDB

Quand vous créez une base de données, vous devez faire attention à plusieurs problématiques, dont sa légèreté et sa compréhension rapide. Et la chose qu’il ne faut surtout pas faire, c’est des répétitions d’objet car non seulement ça alourdit la base, mais ça devient très compliqué en cas de modification d’objet. Aujourd’hui, on va voir comment faire une association d’objet dans d’autres objets avec MongoDB. Ça parait compliqué mais vous allez voir, c’est plus simple qu’il n’y parait.

Ryan Djoher

16/03/2021 - 4 minutes de lecture

Assemble

Comme à mon habitude, je vais expliquer le concept avec un exemple des plus basiques pour ne pas vous perdre dès le premier paragraphe.

Imaginons que nous nous occupons d’un site où des utilisateurs peuvent lire des manga, cela veut dire qu’on a une base de donnée qui contiendra une collection d’utilisateur et une collection de manga. Si on devait schématiser, voici ce qu’on obtiendrait :

{
  "_id" : ObjectId("541fs5dfdsf546sd2f1ds"),
  "name" : "Ryan",
  "email" : "jaimelesmanga@gmail.com",
  "lang" : "fr"
  "zipcode": 75001,
  "mangaAlreadyRead": []
}

Très basique. Maintenant, place au schéma du manga :

{
  "_id" : ObjectId("8d7f87ds96s66ssfddf"),
  "title":"Berserk",
  "author": "Kentaro Miura",
  "tome": 40
}

Là non plus, pas besoin de faire compliquer. Pour les plus novice d’entres nous, sachez que le document « _id » a été crée automatiquement par MongoDB lors de la création de l'objet, afin qu’il puisse avoir un document unique et éviter les doublons. Si, pour une raison bizarre, on veut créer le même objet avec les mêmes infos, voici comment MongoDB l’intégrerait dans sa base :

{
  "_id" : ObjectId("8d7f87ds96s66ssfddf"),
  "title":"Berserk",
  "author": "Kentaro Miura",
  "tome":40
}
{
  "_id" : ObjectId("43d45s64dsf1215e6z6"),
  "title":"Berserk",
  "author": "Kentaro Miura",
  "tome":40
}

Vous voyez ? MongoDB s’est occupé de mettre un « _id » différent pour qu’il puisse les différencier. Bref, revenons à nos moutons.

Imaginons maintenant que Ryan (oui c’est moi) vient de lire le manga en question, il faut que la base de données le sache pour, par exemple, ne pas lui reproposer de lire ce manga sur le site. Si vous jetez encore un coup d’œil à l’objet de l’utilisateur, vous remarquerez un document qui se nomme « mangaAlreadyRead ». C’est ici que nous allons noter tous les manga qui ont déjà été lu par Ryan.

Ce qu’il ne faut pas faire

Nous sommes donc tentés de mettre une copie de l’objet du manga Berserk dans le document « mangaAlreadyRead » comme ceci :

{
    "_id" : ObjectId("541fs5dfdsf546sd2f1ds"),
    "name" : "Ryan",
    "email" : "jaimelesmanga@gmail.com",
    "lang" : "fr"
    "zipcode": 75001,
    "mangaAlreadyRead": [{
      "_id" : ObjectId("8d7f87ds96s66ssfddf"),
      "title":"Berserk",
      "author": "Kentaro Miura",
      "tome":40
    }]
  }

Avec l’objet dans le tableau « mangaAlreadyRead », on pourra savoir que Ryan a lu ce manga. Dans l’idée c’est juste, mais dans la pratique c’est pas bon.

Si on fait comme ça, on aura un doublon de l’objet du manga Berserk. Non seulement il existera dans la collection manga (là où il doit être) mais aussi dans la collection de l’utilisateur, plus précisément dans « mangaAlreadyRead ». Vous ne voyez pas encore le souci ?

Maintenant imaginons que l’on doive modifier l’objet du manga car un nouveau tome vient d’être disponible, il faudra le modifier dans la collection manga… mais aussi chez tous les utilisateurs qui ont lu le manga. Et ça, croyez-moi, vous n’avez pas envie de le faire. C’est là que les associations entrent en jeu.

Ce qu’il faut faire

C’est ici que le document « _id » est très utile car au lieu de mettre tout l’objet du manga dans l’objet de l’utilisateur, on va juste mettre ce fameux _id.

{
    "_id" : ObjectId("541fs5dfdsf546sd2f1ds"),
    "name" : "Ryan",
    "email" : "jaimelesmanga@gmail.com",
    "lang" : "fr"
    "zipcode": 75001,
    "mangaAlreadyRead": [ ObjectId("8d7f87ds96s66ssfddf")]
  }

Maintenant, la liaison est faite entre l’utilisateur et le manga. Et quand on modifiera le manga pour augmenter ses tomes, on n’aura plus besoin de toucher à autre chose. Comme vous pouvez le voir, « mangaAlreadyRead » est un tableau, donc on peut lui mettre autant de manga qu’on veut. Pratique non ?

En conclusion, on a juste besoin de mettre le « _id » automatiquement crée par MongoDB et c’est lui qui gérera le reste.

Si, comme moi, vous êtes un grand utilisateur de Mongoose, savez que la logique est la même, sauf la syntaxe qui sera un peu différente. Mais dans l’esprit, c’est la même chose.

J’espère vous avoir aidé à y voir plus claire dans l’utilisation optimale des bases de données. Je vous donne rendez-vous une prochaine fois pour de nouvelles aventures.