MongoDB vs. MySQL: Wie man wählt

Während der Dotcom-Blase in den 1990er Jahren war LAMP ein gängiger Software-Stack für Webanwendungen, der ursprünglich für Linux (OS), Apache (Webserver), MySQL (relationale Datenbank) und PHP (Server-Programmiersprache) stand. MySQL war die bevorzugte Datenbank, vor allem, weil es kostenloses Open Source war und eine gute Leseleistung aufwies, die gut zu „Web 2.0“ -Apps passte, die dynamisch Websites aus der Datenbank generierten.

Später wurde der MEAN-Stack, der für MongoDB (Dokumentendatenbank), Express (Webserver), AngularJS (Front-End-Framework) und Node.js (Back-End-JavaScript-Laufzeit) stand, bekannt. Der MEAN-Stack war unter anderem deshalb attraktiv, weil Sie nur JavaScript kennen mussten. Es benötigte auch weniger RAM als ein äquivalenter LAMP-Stack.

Was ist MySQL / MariaDB?

Monty Widenius und David Axmark von MySQL AB haben MySQL ursprünglich ab 1994 entwickelt. Das "My" im Produktnamen bezieht sich auf Widenius 'Tochter, nicht auf das englische Wort "my". MySQL wurde so konzipiert, dass es API-kompatibel mit mSQL (auch bekannt als Mini SQL) ist, mit einer zusätzlichen SQL-Abfrageschicht und einer Open Source-Lizenz (eigentlich eine doppelte Lizenz, sowohl proprietär als auch GPL). Öffentliche MySQL-Versionen begannen Ende 1996 und wurden alle ein oder zwei Jahre fortgesetzt. MySQL ist derzeit die beliebteste relationale Datenbank.

Sun Microsystems erwarb MySQL AB im Jahr 2008 (für 1 Milliarde US-Dollar) und Oracle Sun im Jahr 2010. Widenius gab MySQL 5.5 kurz vor der Übernahme von Oracle in MariaDB ein, da die Absichten von Oracle für MySQL weit verbreitet waren. MariaDB hat sich bemüht, die Kompatibilität mit Oracle MySQL-Versionen aufrechtzuerhalten.

MySQL war ursprünglich eine relativ einfache relationale Datenbank im Vergleich zu leistungsfähigeren kommerziellen relationalen Datenbanken wie Oracle Database, IBM DB / 2 und Microsoft SQL Server, obwohl es gut genug war, um als Hintergrundspeicher für dynamische Websites zu dienen. Im Laufe der Jahre wurden die meisten Funktionen hinzugefügt, die Sie von einer relationalen Datenbank erwarten, darunter Transaktionen, Einschränkungen der referenziellen Integrität, gespeicherte Prozeduren, Cursor, Volltextindizierung und -suche, geografische Indizierung und Suche sowie Clustering.

MySQL wird normalerweise immer noch in kleinen bis mittelgroßen Bereitstellungen verwendet, obwohl es jetzt Funktionen für große Datenbanken wie Master-Slave-Bereitstellungen, Verwendung mit Memcached und horizontales Sharding unterstützt. Das Skalieren von MySQL auf mehrere Slaves verbessert die Leseleistung, aber nur der Master akzeptiert Schreibanforderungen.

AWS bietet MySQL als Service in zwei Varianten an: Amazon RDS und Amazon Aurora. Letzteres hat eine viel höhere Leistung, kann Terabyte an Daten verarbeiten, hat eine geringere Verzögerungszeit für die Aktualisierung von Replikaten und konkurriert direkt mit Oracle Database und SQL Server.

Was ist MongoDB?

MongoDB ist eine hoch skalierbare, betriebsbereite Dokumentendatenbank, die sowohl in Open Source- als auch in kommerziellen Unternehmensversionen verfügbar ist. Sie kann lokal oder als verwalteter Cloud-Dienst ausgeführt werden. Der verwaltete Cloud-Dienst heißt MongoDB Atlas.

MongoDB ist mit Abstand die beliebteste NoSQL-Datenbank. Das Dokumentdatenmodell bietet Entwicklern große Flexibilität, während die verteilte Architektur eine große Skalierbarkeit ermöglicht. Daher wird MongoDB häufig für Anwendungen ausgewählt, die große Datenmengen verwalten müssen, von horizontaler Skalierbarkeit profitieren und Datenstrukturen verarbeiten, die nicht zum relationalen Modell passen.

MongoDB ist ein dokumentbasierter Speicher, auf dem auch ein grafischer Speicher implementiert ist. MongoDB speichert JSON nicht: Es speichert BSON (Binary JSON), wodurch die JSON-Darstellung (Zeichenfolgen) um zusätzliche Typen wie int, long, date, gleitkomma, decimal128 und Geodatenkoordinaten erweitert wird.

MongoDB kann multimodale Diagramm-, Geodaten-, B-Baum- und Volltextindizes für eine einzelne Kopie der Daten generieren, wobei der Datentyp verwendet wird, um den richtigen Indextyp zu generieren. Mit MongoDB können Sie Indizes für jedes Dokumentfeld erstellen. MongoDB 4 verfügt über Transaktionen mit mehreren Dokumenten. Dies bedeutet, dass Sie auch dann ACID-Eigenschaften erhalten können, wenn Sie Ihr Daten-Design normalisieren müssen.

Standardmäßig verwendet MongoDB dynamische Schemas, die manchmal als schemalos bezeichnet werden. Die Dokumente in einer einzelnen Sammlung müssen nicht denselben Feldsatz haben, und der Datentyp für ein Feld kann je nach Dokument innerhalb einer Sammlung unterschiedlich sein. Sie können Dokumentstrukturen jederzeit mit dynamischen Schemas ändern.

Schema-Governance ist jedoch verfügbar. Ab MongoDB 3.6 unterstützt MongoDB die JSON-Schemaüberprüfung, die Sie in Ihrem Validatorausdruck aktivieren können.

Die LAMP- und MEAN-Stapel

Es gibt viele Variationen der LAMP- und MEAN-Stapel. Anstelle des Linux-Betriebssystems können Sie beispielsweise Windows (WAMP) oder MacOS (MAMP) ausführen. Anstelle des Apache-Webservers unter Windows können Sie IIS (WIMP) ausführen.

Anstelle der relationalen MySQL-Datenbank im LAMP-Stack können Sie PostgreSQL oder SQL Server ausführen. Wenn Sie eine globale Distribution benötigen, können Sie CockroachDB oder Google Cloud Spanner ausführen. Anstelle der PHP-Sprache können Sie auch Perl oder Python codieren. Wenn Sie in Java oder C # codieren möchten, müssen Sie verschiedene Stapelfamilien berücksichtigen.

Anstelle der MongoDB-Dokumentendatenbank im MEAN-Stapel können Sie Couchbase oder Azure Cosmos DB für eine bessere globale Verteilung ausführen. Anstelle von Express können Sie auch ein Dutzend Node.js-Webserver-Frameworks verwenden. Anstelle des AngularJS-Front-End-Frameworks können Sie Angular 2 oder React ausführen.

So wählen Sie eine Datenbank für Ihre Anwendung aus

Die wichtigsten Fragen, die Sie bei der Auswahl einer Datenbank stellen müssen, sind:

  • Wie viele Daten werden voraussichtlich gespeichert, wenn die Anwendung ausgereift ist?
  • Wie viele Benutzer werden voraussichtlich bei Spitzenlast gleichzeitig behandelt?
  • Welche Verfügbarkeit, Skalierbarkeit, Latenz, Durchsatz und Datenkonsistenz benötigt Ihre Anwendung?
  • Wie oft ändern sich Ihre Datenbankschemata?
  • Wie ist die geografische Verteilung Ihrer Benutzerpopulation?
  • Was ist die natürliche „Form“ Ihrer Daten?
  • Benötigt Ihre Anwendung Online-Transaktionsverarbeitung (OLTP), analytische Abfragen (OLAP) oder beides?
  • Welches Verhältnis von Lesevorgängen zu Schreibvorgängen erwarten Sie in der Produktion?
  • Benötigen Sie geografische Abfragen und / oder Volltextabfragen?
  • Was sind Ihre bevorzugten Programmiersprachen?
  • Hast du ein Budget? Wenn ja, werden Lizenzen und Supportverträge abgedeckt?

Einige dieser Fragen werden die Auswahl einer Datenbank einschränken, aber wir haben viel mehr Auswahlmöglichkeiten als bei der Formulierung des LAMP-Stapels. Wenn Sie eine Anwendung erstellen, die für Benutzer auf der ganzen Welt zu 99,999 Prozent mit hoher Konsistenz verfügbar sein muss, sind nur wenige Datenbanken genau das Richtige für Sie. Wenn Ihre Anwendung an Wochentagen von 9 bis 18 Uhr in einem Land verwendet wird und eventuelle Konsistenz toleriert, funktioniert fast jede Datenbank, obwohl einige für Entwickler und Betreiber einfacher sind und andere eine bessere Leistung für Ihre primären Nutzungsszenarien bieten .

Während die LAMP- und MEAN-Stacks zu einer Zeit gute Lösungen für Webanwendungen waren, ist derzeit keine optimal. Anstatt den einen oder anderen blind zu übernehmen, sollten Sie Ihre Anwendungsfälle durchdenken und eine Architektur finden, die Ihrer Anwendung auf absehbare Zeit dient.

SQL oder NoSQL?

Wann möchten Sie eine relationale Datenbank wie MySQL für eine neue Anwendung? Abgesehen von der offensichtlichen Unterstützung für Standard-SQL erzwingen relationale Datenbanken per se die Daten in ein tabellarisches Schema mit konsistent starker Typisierung von Feldern und helfen Ihnen, Datenverdopplungen zu vermeiden, solange Sie die Normalisierung nutzen.

Wenn Sie fehlende Daten vermeiden möchten, können NOT NULLSie beim Erstellen oder Ändern von Tabellen Felder deklarieren . Wenn Sie geografische Abfragen benötigen, wie sie vom Open Geospatial Consortium definiert wurden, bieten die meisten relationalen Datenbanken eine robuste Implementierung. Wenn Sie eine Volltextsuche benötigen, können Sie in den meisten relationalen Datenbanken invertierte Listenindizes für Textfelder definieren, die FULLTEXTin MySQL als Indizes bezeichnet werden.

Wenn Sie jedoch gelegentlich auch ein Freiformdokument benötigen, unterstützen MySQL und viele andere relationale Datenbanken auch JSON-Daten gemäß RFC 7159. Wenn Sie auch XML-Dokumente und XPath oder XSLT verwenden möchten, bieten die meisten relationalen Datenbanken dies diese Fähigkeit.

Wann möchten Sie eine Dokumentendatenbank wie MongoDB? Wenn Ihr primärer Anwendungsfall Freiformdaten, Felder, deren Typen von Dokument zu Dokument geändert werden, ein Schema, das sich im Laufe der Zeit ändert, oder verschachtelte Dokumente zulassen muss, erfüllt eine NoSQL-Datenbank die Anforderungen. Wenn Ihre Anwendung in JavaScript geschrieben ist, passt das JSON-Format von Dokumentdatenbanken natürlich dazu.