MongoDB - Relations

Les relations dans MongoDB représentent la manière dont divers documents sont logiquement liés les uns aux autres. Les relations peuvent être modélisées viaEmbedded et Referencedapproches. Ces relations peuvent être 1: 1, 1: N, N: 1 ou N: N.

Prenons le cas du stockage des adresses des utilisateurs. Ainsi, un utilisateur peut avoir plusieurs adresses, ce qui en fait une relation 1: N.

Voici un exemple de structure de document de user document -

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

Voici un exemple de structure de document de address document -

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

Modélisation des relations intégrées

Dans l'approche intégrée, nous intégrerons le document d'adresse dans le document utilisateur.

> db.users.insert({
	{
		"_id":ObjectId("52ffc33cd85242f436000001"),
		"contact": "987654321",
		"dob": "01-01-1991",
		"name": "Tom Benzamin",
		"address": [
			{
				"building": "22 A, Indiana Apt",
				"pincode": 123456,
				"city": "Los Angeles",
				"state": "California"
			},
			{
				"building": "170 A, Acropolis Apt",
				"pincode": 456789,
				"city": "Chicago",
				"state": "Illinois"
			}
		]
	}
})

Cette approche conserve toutes les données associées dans un seul document, ce qui facilite la récupération et la maintenance. L'ensemble du document peut être récupéré en une seule requête telle que -

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

Notez que dans la requête ci-dessus, db et users sont respectivement la base de données et la collection.

L'inconvénient est que si le document incorporé continue de croître trop en taille, cela peut avoir un impact sur les performances de lecture / écriture.

Modélisation des relations référencées

C'est l'approche de la conception de relations normalisées. Dans cette approche, les documents d'utilisateur et d'adresse seront conservés séparément, mais le document d'utilisateur contiendra un champ qui référencera le document d'adresse.id champ.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

Comme indiqué ci-dessus, le document utilisateur contient le champ tableau address_idsqui contient des ObjectIds des adresses correspondantes. En utilisant ces ObjectIds, nous pouvons interroger les documents d'adresse et obtenir des détails d'adresse à partir de là. Avec cette approche, nous aurons besoin de deux requêtes: d'abord pour récupérer leaddress_ids champs de user document et deuxième pour récupérer ces adresses de address collection.

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})