Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Databases

Zuordnung relationaler Datenbanken und SQL zu MongoDB

by
Length:LongLanguages:

German (Deutsch) translation by Nikol Angelowa (you can also view the original English article)

NoSQL-Datenbanken haben sich in den letzten Jahren aufgrund ihrer weniger eingeschränkten Struktur, des skalierbaren Schemadesigns und des schnelleren Zugriffs im Vergleich zu herkömmlichen relationalen Datenbanken (RDBMS/SQL) enorm entwickelt. MongoDB ist eine dokumentenorientierte Open Source-NoSQL-Datenbank, in der Daten in Form von JSON-ähnlichen Objekten gespeichert werden. Es hat sich aufgrund seines dynamischen Schemas, seiner hohen Skalierbarkeit, seiner optimalen Abfrageleistung, seiner schnelleren Indizierung und seiner aktiven Benutzergemeinschaft zu einer der führenden Datenbanken entwickelt.

Wenn Sie aus einem RDBMS / SQL-Hintergrund stammen, kann es zu Beginn schwierig sein, NoSQL- und MongoDB-Konzepte zu verstehen, da beide Technologien eine sehr unterschiedliche Art der Datendarstellung aufweisen. In diesem Artikel erfahren Sie, wie die RDBMS/SQL-Domäne, ihre Funktionen, Begriffe und die Abfragesprache der MongoDB-Datenbank zugeordnet werden. Mit Mapping meine ich, dass wir, wenn wir ein Konzept in RDBMS/SQL haben, sehen werden, was das entsprechende Konzept in MongoDB ist.

Wir beginnen mit der Zuordnung der grundlegenden relationalen Konzepte wie Tabelle, Zeile, Spalte usw. und gehen auf die Indizierung und Verknüpfungen ein. Wir werden uns dann die SQL-Abfragen ansehen und die entsprechenden MongoDB-Datenbankabfragen diskutieren. In dem Artikel wird davon ausgegangen, dass Sie mit den rundlegenden relationalen Datenbankkonzepten und SQL vertraut sind, da im gesamten Artikel mehr Wert darauf gelegt wird, zu verstehen, wie diese Konzepte in MongoDB abgebildet werden. Lass uns anfangen.


Zuordnen von Tabellen, Zeilen und Spalten

Jede Datenbank in MongoDB besteht aus Sammlungen, die einer RDBMS-Datenbank entsprechen, die aus SQL-Tabellen besteht. Jede Sammlung speichert Daten in Form von Dokumenten, die Tabellen entsprechen, in denen Daten in Zeilen gespeichert sind. Während eine Zeile Daten in ihren Spalten speichert, hat ein Dokument eine JSON-ähnliche Struktur (in MongoDB als BSON bezeichnet). So wie wir Zeilen in einer SQL-Zeile haben, haben wir schließlich Felder in MongoDB. Es folgt ein Beispiel für ein Dokument (gelesene Zeile) mit einigen Feldern (gelesene Spalten), in denen Benutzerdaten gespeichert sind:

Dieses Dokument entspricht einer einzelnen Zeile in RDBMS. Eine Sammlung besteht aus vielen solchen Dokumenten, genauso wie eine Tabelle aus vielen Zeilen besteht. Beachten Sie, dass jedes Dokument in einer Sammlung über ein eindeutiges _id-Feld verfügt. Hierbei handelt es sich um ein 12-Byte-Feld, das als Primärschlüssel für die Dokumente dient. Das Feld wird beim Erstellen des Dokuments automatisch generiert und zur eindeutigen Identifizierung jedes Dokuments verwendet.

Um die Zuordnungen besser zu verstehen, nehmen wir ein Beispiel für einen SQL-Tabellen users und seine entsprechende Struktur in MongoDB. Wie in Abb. 1 dargestellt, wird jede Zeile in der SQL-Tabelle in ein Dokument und jede Spalte in ein Feld in MongoDB umgewandelt.

Figure 1 Mapping Table to Collection (1)
Abbildung 1

Dynamisches Schema

Eine interessante Sache, auf die man sich hier konzentrieren sollte, ist, dass verschiedene Dokumente innerhalb einer Sammlung unterschiedliche Schemata haben können. In MongoDB ist es also möglich, dass ein Dokument fünf Felder und das andere Dokument sieben Felder enthält. Die Felder können jederzeit einfach hinzugefügt, entfernt und geändert werden. Es gibt auch keine Einschränkung für die Datentypen der Felder. Somit kann ein Feld in einer Instanz Daten vom Typ int enthalten und in der nächsten Instanz kann es ein array enthalten.

Diese Konzepte müssen den Lesern aus dem RDBMS-Hintergrund, in denen die Tabellenstrukturen, ihre Spalten, Datentypen und Beziehungen vordefiniert sind, sehr unterschiedlich erscheinen. Mit dieser Funktion zur Verwendung des dynamischen Schemas können wir zur Laufzeit dynamische Dokumente generieren.

Betrachten Sie beispielsweise die folgenden zwei Dokumente in derselben Sammlung, die jedoch unterschiedliche Schemata aufweisen (Abb. 2):

Figure 2 Documents in a Collection having different structure
Figur 2

Das erste Dokument enthält die Felder address und dob, die im zweiten Dokument nicht vorhanden sind, während das zweite Dokument die Felder gender und occupation enthält, die im ersten Dokument nicht vorhanden sind. Stellen Sie sich vor, wir hätten dieses Ding in SQL entworfen und vier zusätzliche Spalten für address, dob, gender und occupation beibehalten, von denen einige leere (oder null) Werte speichern und somit unnötigen Platz belegen würden.

Dieses Modell des dynamischen Schemas ist der Grund, warum NosSQL-Datenbanken hinsichtlich des Designs hoch skalierbar sind. Verschiedene komplexe Schemata (hierarchisch, baumstrukturiert usw.), die eine Anzahl von RDBMS-Tabellen erfordern würden, können unter Verwendung solcher Dokumente effizient entworfen werden. Ein typisches Beispiel wäre das Speichern von Benutzerbeiträgen, deren Likes, Kommentaren und anderen zugehörigen Informationen in Form von Dokumenten. Eine SQL-Implementierung für dasselbe würde idealerweise separate Tabellen zum Speichern von Posts, Kommentaren und Likes haben, während ein MongoDB-Dokument alle diese Informationen in einem einzigen Dokument speichern kann.


Zuordnungen und Beziehungen zuordnen

Beziehungen in RDBMS werden mithilfe von Primär- und Fremdschlüsselbeziehungen hergestellt und mithilfe von Verknüpfungen abgefragt. In MongoDB gibt es keine so einfache Zuordnung, aber die Beziehungen hier werden mithilfe eingebetteter und verknüpfter Dokumente entworfen.

Stellen Sie sich ein Beispiel vor, in dem Benutzerinformationen und entsprechende Kontaktinformationen gespeichert werden müssen. Ein ideales SQL-Design hätte zwei Tabellen, z. B. user_information und contact_information, mit den Primärschlüssel-id und contact_id, wie in Abb. 3 dargestellt. Die Tabelle contact_information würde auch eine Spalte user_id enthalten, die der Fremdschlüssel ist, der mit dem id-Feld der Tabelle user_information verknüpft ist.

Figure 3
Figur 3

Jetzt werden wir sehen, wie wir solche Beziehungen in MongoDB mithilfe von Ansätzen zum Verknüpfen von Dokumenten und eingebetteten Dokumenten entwerfen würden. Beachten Sie, dass wir im SQL-Schema im Allgemeinen eine Spalte hinzufügen (in unserem Fall id und contact_id), die als primäre Spalte für diese Tabelle fungiert. In MongoDB verwenden wir jedoch im Allgemeinen das automatisch generierte Feld _id als Primärschlüssel, um die Dokumente eindeutig zu identifizieren.

Dokumente verknüpfen

Bei diesem Ansatz werden zwei Sammlungen verwendet, user_information und contact_information, die beide ihre eindeutigen _id-Felder haben. Wir haben ein Feld user_id im contact_information dokument, das sich auf das Feld _id des user_information dokuments bezieht und angibt, welchem Benutzer der Kontakt entspricht. (Siehe Abb. 4) Beachten Sie, dass in MongoDB die Beziehungen und ihre entsprechenden Operationen manuell (z. B. durch Code) erledigt werden müssen, da keine Fremdschlüsseleinschränkungen und -regeln gelten.

Figure 4 Linking Documents in MongoDB
Figur 4

Das Feld user_id in unserem Dokument ist einfach ein Feld, das einige Daten enthält, und die gesamte damit verbundene Logik muss von uns implementiert werden. Selbst wenn Sie beispielsweise eine user_id in das contact_information dokument einfügen, die nicht in der user_infromation sammlung vorhanden ist, gibt MongoDB keinen Fehler aus, der besagt, dass die entsprechende user_id nicht in der user_information sammlung gefunden wurde (im Gegensatz zu SQL, wo dies eine wäre ungültige Fremdschlüsseleinschränkung).

Dokumente einbetten

Der zweite Ansatz besteht darin, das contact_information dokument wie folgt in das user_information dokument einzubetten (Abb. 5):

Figure 5 Embedding Documents in MongoDB
Abbildung 5

Im obigen Beispiel haben wir ein kleines Dokument mit Kontaktinformationen in die Benutzerinformationen eingebettet. In ähnlicher Weise können große komplexe Dokumente und hierarchische Daten auf diese Weise eingebettet werden, um Entitäten in Beziehung zu setzen.

Welcher Ansatz für den Linking- und den Embedded-Ansatz verwendet werden soll, hängt vom jeweiligen Szenario ab. Wenn erwartet wird, dass die einzubettenden Daten größer werden, ist es besser, den Linking-Ansatz anstelle des Embedded-Ansatzes zu verwenden, um zu vermeiden, dass das Dokument zu groß wird. Der eingebettete Ansatz wird im Allgemeinen in Fällen verwendet, in denen eine begrenzte Menge an Informationen (wie die Adresse in unserem Beispiel) eingebettet werden muss.


Kartendiagramm

Zusammenfassend stellt das folgende Diagramm (Abb. 6) die gemeinsamen Zusammenhänge dar, die wir diskutiert haben:

Figure 6 Mapping Chart
Abbildung 6

Zuordnen von SQL zu MongoDB-Abfragen

Nachdem wir mit den grundlegenden Zuordnungen zwischen RDBMS und MongoDB vertraut sind, werden wir diskutieren, wie sich die für die Interaktion mit der Datenbank verwendete Abfragesprache zwischen ihnen unterscheidet.

Nehmen wir für MongoDB-Abfragen einen Sammlungs users mit einer Dokumentstruktur wie folgt an:

Für SQL-Abfragen nehmen wir an, dass die Tabellen users fünf Spalten mit der folgenden Struktur haben:

Figure 7 Sample SQL Table
Abbildung 7

Wir werden Abfragen zum Erstellen und Ändern von Sammlungen (oder Tabellen), Einfügen, Lesen, Aktualisieren und Entfernen von Dokumenten (oder Zeilen) erörtern. Für jeden Punkt gibt es zwei Abfragen, eine für SQL und eine für MongoDB. Ich werde die MongoDB-Abfragen nur erklären, da wir mit den SQL-Abfragen ziemlich vertraut sind. Die hier vorgestellten MongoDB-Abfragen werden in der Mongo-JavaScript-Shell geschrieben, während die SQL-Abfragen in MySQL geschrieben werden.

Erstellen

In MongoDB muss die Auflistungsstruktur nicht explizit erstellt werden (wie bei Tabellen, die eine CREATE TABLE-Abfrage verwenden). Die Struktur des Dokuments wird automatisch erstellt, wenn die erste Einfügung in die Sammlung erfolgt. Sie können jedoch mit dem Befehl createCollection eine leere Sammlung erstellen.

Einfügen

Um ein Dokument in MongoDB einzufügen, verwenden wir die insert-Methode, die ein Objekt mit Schlüsselwertpaaren als Eingabe verwendet. Das eingefügte Dokument enthält das automatisch generierte Feld _id. Sie können jedoch auch explizit einen 12-Byte-Wert als _id zusammen mit den anderen Feldern angeben.

In MongoDB gibt es keine Funktion zum Alter Table, um die Dokumentstruktur zu ändern. Da die Dokumente im Schema dynamisch sind, ändert sich das Schema, sobald eine Aktualisierung des Dokuments erfolgt.

Lesen

MongoDB verwendet die find-Methode, die dem SELECT-Befehl in SQL entspricht. Die folgenden Anweisungen lesen einfach alle Dokumente aus der posts-Sammlung.

Die folgende Abfrage führt eine bedingte Suche nach Dokumenten mit dem Feld user_name als mark durch. Alle Kriterien zum Abrufen der Dokumente müssen in die ersten durch Kommas getrennten Klammern {} gesetzt werden.

Die folgende Abfrage ruft bestimmte Spalten ab, post_text und post_likes_count, wie im zweiten Satz von geschweiften Klammern {} angegeben.

Beachten Sie, dass MongoDB standardmäßig das Feld _id bei jeder find-Anweisung zurückgibt. Wenn wir dieses Feld nicht in unserer Ergebnismenge haben möchten, müssen wir den Schlüssel _id mit einem Wert von 0 in der Liste der abzurufenden Spalten angeben. Der Wert 0 des Schlüssels gibt an, dass dieses Feld aus der Ergebnismenge ausgeschlossen werden soll.

Die folgende Abfrage ruft bestimmte Felder basierend auf den Kriterien ab, nach denen user_name mark ist.

Wir werden nun ein weiteres Kriterium hinzufügen, um die Beiträge mit dem Datenschutztyp als öffentlich abzurufen. Die mit Kommas angegebenen Kriterienfelder repräsentieren die logische AND-Bedingung. Daher sucht diese Anweisung nach Dokumenten, die sowohl user_name als mark als auch post_privacy als public haben.

Um ein logisches OR zwischen den Kriterien in der find-Methode zu verwenden, verwenden wir den Operator $or.

Als nächstes verwenden wir die sort-Methode, die das Ergebnis in aufsteigender Reihenfolge von post_likes_count (angezeigt durch 1) sortiert.

Um die Ergebnisse in absteigender Reihenfolge zu sortieren, geben wir -1 als Wert des Feldes an.

Um die Anzahl der zurückzugebenden Dokumente zu begrenzen, verwenden wir die limit-Methode, die die Anzahl der Dokumente angibt.

Die Art und Weise, wie wir offset in SQL verwenden, um eine bestimmte Anzahl von Datensätzen zu überspringen, verwenden wir die skip-Funktion in MongoDB. Mit der folgenden Anweisung werden beispielsweise zehn Posts abgerufen, wobei die ersten fünf übersprungen werden.

Aktualisieren

Der erste Parameter der update-Methode gibt die Kriterien für die Auswahl der Dokumente an. Der zweite Parameter gibt den tatsächlich auszuführenden Aktualisierungsvorgang an. In der folgenden Abfrage werden beispielsweise alle Dokumente mit user_name als mark ausgewählt und ihre post_privacy als private festgelegt.

Ein Unterschied besteht darin, dass die MongoDB update-Abfrage standardmäßig nur ein (und das erste übereinstimmende) Dokument aktualisiert. Um alle übereinstimmenden Dokumente zu aktualisieren, müssen wir einen dritten Parameter angeben, der multi als true angibt und angibt, dass mehrere Dokumente aktualisiert werden sollen.

Entfernen

Das Entfernen von Dokumenten ist recht einfach und ähnelt SQL.

Indizierung

MongoDB verfügt über einen Standardindex, der für das Feld _id jeder Sammlung erstellt wird. Um neue Indizes für die Felder zu erstellen, verwenden wir die Methode ensureIndex, die die Felder und die zugehörige Sortierreihenfolge angibt, die mit 1 oder -1 angegeben sind (aufsteigend oder absteigend).

Um alle in einer Sammlung vorhandenen Indizes anzuzeigen, verwenden wir die Methode getIndexes in denselben Zeilen der SQL-Abfrage SHOW INDEX.


Abschluss

In diesem Artikel haben wir verstanden, wie sich die elementaren Konzepte und Begriffe von RDBMS/SQL in MongoDB verhalten. Wir haben uns mit dem Entwerfen von Beziehungen in MongoDB befasst und gelernt, wie die Funktionalität grundlegender SQL-Abfragen in MongoDB abgebildet wird.

Nachdem Sie sich mit diesem Artikel einen Vorsprung verschafft haben, können Sie komplexe Abfragen wie Aggregation, Kartenreduzierung und Abfragen mit mehreren Sammlungen ausprobieren. Sie können auch einige Online-Tools verwenden, um SQL-Abfragen zu Beginn in MongoDB-Abfragen zu konvertieren. Sie können selbst ein Beispiel für ein MongoDB-Datenbankschema entwerfen. Eines der besten Beispiele hierfür wäre eine Datenbank zum Speichern von Benutzerbeiträgen, deren Likes, Kommentaren und Kommentar-Likes. Dies gibt Ihnen einen praktischen Überblick über das flexible Schemadesign, das MongoDB bietet.

Fühlen Sie sich frei, Vorschläge, Fragen oder Ideen zu kommentieren, die Sie weiter sehen möchten.

Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.