MongoDB - Beziehungen

Beziehungen in MongoDB stellen dar, wie verschiedene Dokumente logisch miteinander verknüpft sind. Beziehungen können über modelliert werdenEmbedded und Referencednähert sich. Solche Beziehungen können entweder 1: 1, 1: N, N: 1 oder N: N sein.

Betrachten wir den Fall des Speicherns von Adressen für Benutzer. Ein Benutzer kann also mehrere Adressen haben, wodurch eine 1: N-Beziehung entsteht.

Es folgt die Beispieldokumentstruktur von user Dokument -

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

Es folgt die Beispieldokumentstruktur von address Dokument -

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

Modellierung eingebetteter Beziehungen

Beim eingebetteten Ansatz wird das Adressdokument in das Benutzerdokument eingebettet.

> 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"
			}
		]
	}
})

Dieser Ansatz verwaltet alle zugehörigen Daten in einem einzigen Dokument, wodurch das Abrufen und Verwalten vereinfacht wird. Das gesamte Dokument kann in einer einzigen Abfrage abgerufen werden, z.

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

Beachten Sie, dass in der obigen Abfrage db und users sind die Datenbank bzw. Sammlung.

Der Nachteil besteht darin, dass eine zu große Größe des eingebetteten Dokuments die Lese- / Schreibleistung beeinträchtigen kann.

Modellierung referenzierter Beziehungen

Dies ist der Ansatz zum Entwerfen einer normalisierten Beziehung. Bei diesem Ansatz werden sowohl das Benutzer- als auch das Adressdokument getrennt verwaltet, das Benutzerdokument enthält jedoch ein Feld, das auf das Adressdokument verweistid Feld.

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

Wie oben gezeigt, enthält das Benutzerdokument das Array-Feld address_idswelches ObjectIds entsprechender Adressen enthält. Mit diesen ObjectIds können wir die Adressdokumente abfragen und von dort Adressdetails abrufen. Bei diesem Ansatz benötigen wir zwei Abfragen: erstens, um die abzurufenaddress_ids Felder aus user Dokument und zweitens, um diese Adressen von abzurufen address Sammlung.

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