MongoDB versus MySQL: hoe te kiezen

Tijdens de dot-com-bubbel in de jaren negentig was een veelgebruikte softwarestack voor webapplicaties LAMP, wat oorspronkelijk stond voor Linux (OS), Apache (webserver), MySQL (relationele database) en PHP (serverprogrammeertaal). MySQL was de geprefereerde database, vooral omdat het gratis open source was en goede leesprestaties had, die goed pasten bij "Web 2.0" -apps die dynamisch sites uit de database genereerden.

Later kwam de MEAN-stack, die stond voor MongoDB (documentendatabase), Express (webserver), AngularJS (front-end framework) en Node.js (back-end JavaScript-runtime), op de voorgrond. De MEAN-stack was onder meer aantrekkelijk omdat JavaScript de enige taal was die u moest kennen. Het had ook minder RAM nodig dan een gelijkwaardige LAMP-stack.

Wat is MySQL / MariaDB?

Monty Widenius en David Axmark van MySQL AB ontwikkelden MySQL oorspronkelijk vanaf 1994. De "My" in de productnaam verwijst naar de dochter van Widenius, niet het Engelse woord "mijn". MySQL is ontworpen om API-compatibel te zijn met mSQL (ook bekend als Mini SQL), met de toevoeging van een SQL-querylaag en een open source-licentie (eigenlijk een dubbele licentie, zowel eigen als GPL). Openbare MySQL-releases begonnen eind 1996 en gingen elk jaar of twee door. MySQL is momenteel de meest populaire relationele database.

Sun Microsystems verwierf MySQL AB in 2008 (voor $ 1 miljard), en Oracle kocht Sun in 2010. Widenius splitste MySQL 5.5 in MariaDB vlak voor de overname van Oracle, te midden van brede bezorgdheid over de bedoelingen van Oracle met MySQL. MariaDB heeft haar best gedaan om de compatibiliteit met Oracle MySQL-versies te behouden.

MySQL begon als een redelijk low-end relationele database in vergelijking met meer capabele commerciële relationele databases zoals Oracle Database, IBM DB / 2 en Microsoft SQL Server, hoewel het goed genoeg was om de back-store voor dynamische websites te zijn. In de loop der jaren heeft het de meeste functies toegevoegd die u van een relationele database verwacht, inclusief transacties, referentiële integriteitsbeperkingen, opgeslagen procedures, cursors, volledige-tekstindexering en doorzoeken, geografische indexering en zoeken, en clustering.

MySQL wordt nog steeds meestal gebruikt in kleine tot middelgrote implementaties, hoewel het nu "grote database" -functies ondersteunt, zoals master-slave-implementaties, gebruik met Memcached en horizontale sharding. Het schalen van MySQL naar meerdere slaves verbetert de leesprestaties, maar alleen de master accepteert schrijfverzoeken.

AWS biedt MySQL als een service aan in twee smaken, Amazon RDS en Amazon Aurora. Deze laatste heeft veel betere prestaties, kan terabytes aan gegevens aan, heeft een lagere vertragingstijd voor het bijwerken van replica's en concurreert rechtstreeks met Oracle Database en SQL Server.

Wat is MongoDB?

MongoDB is een zeer schaalbare, operationele documentendatabase die beschikbaar is in zowel open source als commerciële bedrijfsversies, en het kan op locatie of als een beheerde cloudservice worden uitgevoerd. De beheerde clouddienst heet MongoDB Atlas.

MongoDB is verreweg de meest populaire NoSQL-database. Het documentdatamodel geeft ontwikkelaars grote flexibiliteit, terwijl de gedistribueerde architectuur een grote schaalbaarheid mogelijk maakt. Hierdoor wordt MongoDB vaak gekozen voor applicaties die grote hoeveelheden data moeten beheren, die baat hebben bij horizontale schaalbaarheid en die datastructuren verwerken die niet passen in het relationele model.

MongoDB is een op documenten gebaseerde winkel waar ook een op grafieken gebaseerde winkel bovenop is geïmplementeerd. MongoDB slaat JSON niet echt op: het slaat BSON (Binary JSON) op, waarmee de JSON-weergave (strings) wordt uitgebreid met extra typen zoals int, long, date, floating point, decimal128 en geospatiale coördinaten.

MongoDB kan multimodale grafiek-, geospatiale, B-boom- en volledige-tekstindexen genereren op een enkele kopie van de gegevens, waarbij het type gegevens wordt gebruikt om het juiste type index te genereren. Met MongoDB kunt u indexen maken op elk documentveld. MongoDB 4 heeft transacties met meerdere documenten, wat betekent dat u nog steeds ACID-eigenschappen kunt krijgen, zelfs als u uw gegevensontwerp moet normaliseren.

MongoDB gebruikt standaard dynamische schema's, ook wel schema-loos genoemd. De documenten in een enkele collectie hoeven niet dezelfde set velden te hebben, en het gegevenstype voor een veld kan verschillen tussen documenten binnen een collectie. U kunt op elk moment documentstructuren met dynamische schema's wijzigen.

Schema-governance is echter beschikbaar. Vanaf MongoDB 3.6 ondersteunt MongoDB JSON-schemavalidatie, die u kunt inschakelen in uw validatie-expressie.

De LAMP en MEAN Stacks

Er zijn veel variaties op de LAMP- en MEAN-stapels. In plaats van het Linux-besturingssysteem kunt u bijvoorbeeld op Windows (WAMP) of MacOS (MAMP) draaien. In plaats van de Apache-webserver op Windows kunt u IIS (WIMP) uitvoeren.

In plaats van de relationele MySQL-database in de LAMP-stack, kunt u PostgreSQL of SQL Server gebruiken. Als u wereldwijde distributie nodig heeft, kunt u CockroachDB of Google Cloud Spanner gebruiken. In plaats van de PHP-taal zou je kunnen coderen in Perl of Python. Als u in Java of C # wilt coderen, moet u rekening houden met afzonderlijke stapelfamilies.

In plaats van de MongoDB-documentdatabase in de MEAN-stack, kunt u Couchbase of Azure Cosmos DB gebruiken voor een betere wereldwijde distributie. In plaats van Express kunt u elk van de tientallen Node.js-webserverframeworks gebruiken. In plaats van het AngularJS front-end framework kunt u Angular 2 of React gebruiken.

Hoe u een database kiest voor uw toepassing

De belangrijkste vragen die u moet stellen bij het kiezen van een database zijn:

  • Hoeveel gegevens verwacht u op te slaan als de toepassing volwassen is?
  • Hoeveel gebruikers verwacht u tegelijkertijd te behandelen bij piekbelasting?
  • Welke beschikbaarheid, schaalbaarheid, latentie, doorvoer en dataconsistentie heeft uw applicatie nodig?
  • Hoe vaak veranderen uw databaseschema's?
  • Wat is de geografische spreiding van uw gebruikerspopulatie?
  • Wat is de natuurlijke "vorm" van uw gegevens?
  • Heeft uw applicatie online transactieverwerking (OLTP), analytische queries (OLAP) of beide nodig?
  • Welke verhouding tussen lees- en schrijfbewerkingen verwacht u tijdens de productie?
  • Heeft u geografische zoekopdrachten en / of full-text zoekopdrachten nodig?
  • Wat zijn uw favoriete programmeertalen?
  • Heeft u een budget? Zo ja, dekt het licenties en ondersteuningscontracten?

Verschillende van deze vragen hebben de neiging om de selectie van een database te beperken, maar we hebben veel meer keuzes beschikbaar dan toen de LAMP-stack werd geformuleerd. Als u een applicatie bouwt die 99,999 procent van de tijd beschikbaar moet zijn voor gebruikers over de hele wereld met een sterke consistentie, zijn slechts een paar databases voldoende. Als uw applicatie doordeweeks van 9.00 uur tot 18.00 uur in een bepaald land wordt gebruikt en eventuele consistentie kan tolereren, zal bijna elke database werken, hoewel sommige gemakkelijker zijn voor ontwikkelaars en operators en andere betere prestaties bieden voor uw primaire gebruiksscenario's .

Hoewel de LAMP- en MEAN-stacks ooit goede oplossingen waren voor webapplicaties, is geen van beide nu optimaal. In plaats van blindelings de een of de ander over te nemen, zou u uw use-cases moeten overdenken en een architectuur moeten vinden die uw toepassing in de nabije toekomst zal dienen.

SQL of NoSQL?

Wanneer zou u een relationele database zoals MySQL willen voor een nieuwe applicatie? Afgezien van de voor de hand liggende ondersteuning voor standaard SQL, dwingen relationele databases op zich de gegevens in een tabelschema met consistent krachtig typen van velden, en helpen ze u gegevensduplicatie te voorkomen zolang u profiteert van normalisatie.

Als u ontbrekende gegevens wilt vermijden, kunt u velden declareren NOT NULLwanneer u tabellen maakt of wijzigt. Als u geografische zoekopdrachten nodig heeft zoals gedefinieerd door het Open Geospatial Consortium, bieden de meeste relationele databases een robuuste implementatie. En als u zoeken in volledige tekst nodig heeft, kunt u met de meeste relationele databases geïnverteerde lijstindexen op tekstvelden definiëren, FULLTEXTin MySQL indexen genoemd .

Aan de andere kant, als u ook af en toe een vrij-vorm document nodig heeft, ondersteunen MySQL en vele andere relationele databases ook JSON-gegevens zoals gedefinieerd door RFC 7159. En als u ook XML-documenten en XPath of XSLT wilt gebruiken, bieden de meeste relationele databases dat vermogen.

Wanneer zou je een documentendatabase zoals MongoDB willen? Als uw primaire use-case vrije vormgegevens moet toestaan, velden die van document naar document van type veranderen, een schema dat in de loop van de tijd verandert, of geneste documenten, dan voldoet een NoSQL-database aan de vereisten. Als uw toepassing bovendien in JavaScript is geschreven, is de JSON-indeling van documentdatabases een logische keuze.