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