Seitenanfang

Das große Finale: CouchDB vs. MongoDB vs. Postgres

Dieser Post wurde aus meiner alten WordPress-Installation importiert. Sollte es Darstellungsprobleme, falsche Links oder fehlende Bilder geben, bitte einfach hier einen Kommentar hinterlassen. Danke.


Vor ein paar Tagen habe ich die Frage aufgeworfen, ob mein nächstes Projekt eine SQL-basierte oder NoSQL/dokumentenbasierte Datenbanknutzen soll.

Auf der SQL-Seite tritt Postgres - mein aktuelle Favorit unter den Datenbanken - an und auch wenn regelmäßig neue Versionen herauskommen, kann Postgres als "fertig" betrachtet werden.

Recht neu sind CouchDB und MongoDB, zwei dokumentenorientierte Datenbanken, die für diese Seite in das Rennen gingen. Das Ergebnis ist knapper als erwartet ausgefallen.

And the Winner is... MongoDBDie Entscheidung ist eigentlich unfair, denn weder CouchDB noch MongoDB konnten sich im Gesamtbild (Datenbank + Perl-Integration) bei einem typischen Anwendungsfall wirklich durchsetzen. Der Grund, letztendlich doch den MongoDB-Versuch zu wagen, liegt im Reiz des Neuen: Schon die letzten Tage war ich bereit, im Zweifelsfall einer dokumentenorientierten Datenbank eine Chance zu geben und da Postgres nur knapp vor MongoDB lag, werde ich den Versuch wagen.

Dennoch wird die interne Objektstruktur des Projekts so bleiben, dass ein Umstieg auf Postgres mit vergleichsweise wenig Aufwand möglich werden wird, ohne dabei einen Nachteil für MongoDB zu schaffen.

Punkte für Postgres

DBIx::Class und mein Framework sind fertig, die Konstellation hat sich in verschiedenen Projekte bewährt und insbesondere Relationen zwischen Objekten/Tabellen werden aus den Foreign Keys der Datenbank automatisch bis in die Perl-Objekte übernommen. Geschwindigkeit und Skalierbarkeit von Postgres sind mir bekannt, ebenso die kleinen Macken aller Komponenten.

Punkte für CouchDB

Positiv für CouchDB ist die große Flexibilität zu werten, da keine Tabellen und Strukturen definiert werden müssen und die Views - ich zähle das jetzt als Pluspunkt - vordefiniert werden, damit stehen die Daten im Gegensatz zu SQL bei der Abfrage bereits bereit und müssen nicht erst berechnet werden. Ein fertiges, nutzbares ORM-Framework konnte ich nicht finden

Punkte für MongoDB

Die Flexibilität ist - ebenso wie bei CouchDB - als Pluspunkt zu werten. MongoDB liegt näher an einer SQL-Datenbank, auch der Vorteil der CouchDB-Views entfällt. Allerdings ist MongoDB auch bei der Abfrage flexibler einsetzbar und scheint mir näher an der Realität der täglichen Entwicklungsarbeit als CouchDB, die eher wie eine Konzeptstudie aussieht.

Negativ für MongoDB ist ebenfalls zu werten, dass es kein nutzbares ORM-Framework gibt. Mit Mongooseund MongoDBx::Class gibt es zwar Module, allerdings definieren diese effektiv lediglich eine Method zum Speichern und ein paar Methoden zum finden/laden, ihnen fehlt die angenehme Anwendung von DBIx::Class völlig.

Einen dicken Minuspunkt bekommt die Schnittstelle selbst, MongoDB, für die Abhängigkeit von Moose: Ein kleines schlankes Script mit Datenbankzugriff wird damit unmöglich, weil bei jedem Aufruf das Moose-Monster geladen werden muss. Ein Lichtblick ist dabei die Verwendung von Mousean Stelle von Moose selbst, es ist laut eigener Aussage wesentlich schlanker. Der einzige Grund, MongoDB für diese unnötige Abhängigkeit nicht zu disqualifizieren, ist mod_perl: Da die Module beim Apache-Start geladen werden, wird die Ladezeit nebensächlich.

Was kommt als Nächstes?

Zunächst werde ich ein neues ORM-Framework für MongoDB konstruieren. Dieses soll im Zweifelsfall mit möglichst wenig Aufwand gegen DBIx::Class austauschbar sein, wird aber wesentlich schlanker werden.

 

6 Kommentare. Schreib was dazu

  1. Alexander Hartmaier (abraxxa)

    Wie soll es einen ORM (object relational mapper) geben für eine DB die keine Relationen hat?

  2. Sebastian

    Du hast natürlich Recht, NoSQL kennt keine Relationen. Wobei MongoDB auf Treiberebene durchaus Relationen kennt und die Daten im Endeffekt (fast) immer relational sind - auch wenn die Datenbank davon nichts weiß.

  3. Sid Burn

    MongoDB kennt zwar kein Schema und auch direkt keine Relationen. Trotzdem ändert es nichts daran das die Daten die man selber hat Relational sind. Zum anderen stimmt das mit den Relationen nicht ganz. Auch in MongoDB speichert man die "_id" eines Objektes zwischen oder es gibt DBRef das die Relation in MongoDB automatisch auflöst. Der einzige Punkt ist nur das es halt keine Joins gibt. Daher die Relationen müssen vom Client aufgelöst werden durch eine weitere Anfrage und wird nicht durch eine Anfrage wie man es bei RDBMS gewohnt ist in einem Rutsch geliefert. Relationen hat man damit aber trotzdem noch.


    Ansonsten nutzt MongoDB Any::Moose und nicht Moose. Daher es wird entweder Moose oder Mouse verwendet. Entweder das was schon geladen ist, oder wenn noch nichts geladen wurde wird Mouse genutzt. Damit sind auch schnelle kleine Programme möglich. Für Webapplikationen halte ich das aber unwichtig. Die sollten heute sowieso Persistent sein und am ende unter FastCGI oder ähnliches laufen.


    Zum anderen mag es auch etwas ulkig klingen wenn du Moose ankreidest, im gegenzug aber auch DBIx::Class nutzt das ebenfalls Moose verwendet. Und ein DBIx::Class schema zu laden dauert meist länger als Moose zu laden. Die Kritik an MongoDB und Moose kann man da nicht so ganz ernst nehmen ;)


    Ein ORM-Mapper halte ich für MongoDB für überflüßig. Der einzige grund warum man es unter einem RDBMS verwendet ist die Qual SQL zu generieren. Das ist unter MongoDB so vollständig unnötig. Die Queries die man erzeugt entsprechen schon dem was man jetzt tut unter DBIx::Class mit SQL::Abstract.

  4. sonyon

    Und der Verlierer ist: Perl ;)


    Das es keine passende Unterstützung für die Datenbanken gibt liegt eher an der Programmiersprache als an den Datenbanksystemen.


    Bei genügend Nutzern würde es schon längst welche geben.

  5. Sebastian

    Oh, es gibt schon einen Client, das MongoDB-Modul, allerdings arbeite ich mittlerweile lieber mit Perl-Objekten. Dank Perl ist ein entsprechendes Modul in weniger als einem Tag Arbeit entstanden und wird allen (nicht) Interessierten zur Verfügung stehen, sobald ich die Zeit gefunden habe, es auf CPAN zu laden :-)

  6. freakrobot

    Auf einer Seite ist ORM auf jedenfall kaum nutzbar wegen der langsamen Geschwindigkeit, auf einer anderen Seite wenn Sie mehr "update" und "insert" als "select/find" Operation haben, können Sie bei MongoDB sehr schlecht Resultät bekommen.

Schreib was dazu

Die folgenden HTML-Tags sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>