MongoDB ist eine Dokumentendatenbank und pflegt keine Beziehungen zwischen Dokumenten wie relationale Datenbanken wie PostgreSQL.
MongoDB ermöglicht es Ihnen dennoch, Beziehungen zwischen Dokumenten herzustellen. Diese Beziehungen können entweder durch eingebettete oder referenzierte Ansätze modelliert werden. Lasst uns genauer hinschauen.
Eingebettete Beziehungen vs. Referenzbeziehungen
Bei einem eingebetteten Ansatz wird ein Dokument direkt in ein anderes Dokument eingefügt, was zu verschachtelten Daten führt. Der Vorgang wird auch als „Denormalisierung“ bezeichnet.
Der Referenzansatz hingegen verwendet Dokumentreferenzen, um von einem Dokument auf ein anderes zu verweisen. Dieser Ansatz wird auch „Normalisierung“ genannt.
MongoDB: Eins-zu-Eins-Beziehungen mit eingebetteten Dokumenten
Mit dem eingebetteten Ansatz können Sie eine Eins-zu-Eins-Beziehung zwischen Dokumenten erstellen. Diese Beziehung tritt auf, wenn sich ein Dokumentobjekt nur auf ein anderes Dokument beziehen kann.
Betrachten Sie eine Studentendatenbank. Diese Datenbank enthält die Studenten- und Adresssammlungen mit den folgenden Dokumenten.
// Studentendokument
{
"studentName": "Frodo Beutlin",
"Telefonnummer": "987654321",
};
// Adressdokument
{
"studentName": "Frodo Beutlin",
"street": "Bagshot Row",
"Stadt": "Hobiton",
}
In dieser Datenbank darf ein Student nur eine Adresse haben. Um die Adresse abzurufen, müssen Sie die Adresssammlung mit dem Namen des Schülers abfragen.
Verwandt: So erstellen Sie eine Datenbank und Sammlung in MongoDB
In Fällen, in denen die Adresse zusammen mit anderen Angaben wie a Name des Studenten, müssen Sie die Datenbank mehrmals abfragen. Die Kehrseite davon ist eine hohe Anzahl von Lesevorgängen und folglich eine geringe Abfrageleistung.
Mit dem eingebetteten Ansatz können Sie die Adressdaten direkt in das Studentendokument einfügen und nur eine einzige Abfrage verwenden, um die Daten abzurufen.
{
"studentName": "Frodo Beutlin",
"Telefonnummer": "987654321",
"die Anschrift": [{
"street": "Bagshot Row",
"Stadt": "Hobiton"
}],
};
Zum Abrufen der Adresse über die Name des Studenten, verwenden Sie diese Abfrage.
db.student.findOne({"studentName":"Frodo Beutlin"}, {"Adresse":1})
1:n-Beziehungen mit eingebetteten Dokumenten in MongoDB
Stellen Sie sich eine Situation vor, in der ein Schüler mehrere Adressen hat. Die Beziehung zwischen dem Schüler und den Adressen wird eine Eins-zu-Viele-Beziehung.
Mit dem eingebetteten Modell können Sie dem Schülerdokument mehrere Adressen hinzufügen. Wie bei der Eins-zu-eins-Beziehung mit eingebetteten Dokumenten hat dieser Ansatz eine relativ hohe Abfrageleistung.
{
"studentName": "Frodo Beutlin",
"Telefonnummer": "987654321",
"die Anschrift": [
{
"street": "Bagshot Row",
"Stadt": "Hobiton"
},
{
"street": "Eine weitere Bagshot-Reihe",
"Stadt": "Hobiton2"
},
]
};
Die folgende Abfrage gibt die Adressen des angegebenen Schülernamens zurück.
db.student.findOne({studentName: „Frodo Beutlin“}, {Adresse: 1})
Verwandt: So erstellen Sie Dokumente in MongoDB
Wenn Sie nun mehr Adressen haben und diese immer wieder zum Adressfeld hinzufügen, kann das Dokument ziemlich schnell unübersichtlich werden. Eine Lösung ist die Verwendung von Dokumentreferenzen.
MongoDB: 1:n-Beziehungen mit Dokumentreferenzen
Mit dem Referenzansatz können Sie auch eine 1:n-Beziehung modellieren. In diesem Datenmodell werden die Schüler- und Adressdaten in getrennten Sammlungen gepflegt. Um den Schüler mit seiner Adresse zu verknüpfen, fügen Sie dem Schülerdokument ein Feld mit den Adress-IDs hinzu.
{
"studentName": "Frodo Beutlin",
"Telefonnummer": "987654321",
"die Anschrift": [
ObjectId("61fa7bfeebdadf8ac71427ea"),
Objekt-ID ("61fa7d19ebdadf8ac71427eb")
]
};
Das Abrufen der Adressdetails eines Schülers beinhaltet das Abrufen der Adress-IDs aus dem Schülerdokument und das Verwenden dieser IDs zum Abrufen der tatsächlichen Adressen aus der Sammlung.
const student = db.users.findOne({"name":"Frodo Baggins"},{"address":1})
const Adressen = db.address.find({"_id":{"$in":student["address_ids"]}})
Wahl zwischen eingebetteten und Referenzansätzen
Sowohl das Einbettungs- als auch das Referenzierungsmodell haben ihre Vor- und Nachteile, und Sie müssen ein paar Dinge berücksichtigen, bevor Sie eine Wahl treffen. Zunächst müssen Sie den Anwendungsfall berücksichtigen. Wenn sich die Daten nur auf ein Dokument beziehen, ist das Einbetten möglicherweise die beste Option.
Um 1:n-Beziehungen zu erstellen, können Sie entweder das referenzierende Modell oder das eingebettete Modell verwenden. Die Referenzierung führt zu einem sauberen und konsistenten Dokument, da Sie nur die Referenz-ID des Dokuments hinzufügen, auf das Sie sich beziehen möchten.
Die Anzahl der zum Abrufen der verbundenen Daten erforderlichen Lesevorgänge ist jedoch relativ hoch und kann die Leistung beeinträchtigen. Das Einbetten des Dokuments kann die Leistung verbessern, aber bei vielen verschachtelten Dokumenten kann es am Ende zu einer überlasteten Sammlung kommen.
Die Wahl, wie Sie die Datenbeziehungen in Ihrem Dokument implementieren, liegt daher ganz bei Ihnen. Überlegen Sie, wie Sie das Dokument verwenden werden, welches Abfrageleistungsniveau Sie anstreben und welche Kompromisse Sie bereit sind einzugehen.
Ziehen Sie einen anderen Ansatz für Datenbanken in Betracht? So funktioniert die Datenmodellierung in MongoDB.
Lesen Sie weiter
- Programmierung
- Programmierung
- Datenbank
Mary Gathoni ist eine Softwareentwicklerin mit einer Leidenschaft für die Erstellung technischer Inhalte, die nicht nur informativ, sondern auch ansprechend sind. Wenn sie nicht gerade programmiert oder schreibt, trifft sie sich gerne mit Freunden und ist draußen.
Abonniere unseren Newsletter
Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!
Klicken Sie hier, um sich anzumelden