CouchDB: kurz & gut

Mario Scheliga

Copyright © 2010 O’Reilly Verlag GmbH & Co. KG

Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.

Alle Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen. Der Verlag richtet sich im Wesentlichen nach den Schreibweisen der Hersteller. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

Kommentare und Fragen können Sie gerne an uns richten:

Copyright der deutschen Ausgabe:

Bibliografische Information Der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der
Deutschen Nationalbibliografie; detaillierte bibliografische Daten
sind im Internet über http://dnb.d-nb.de abrufbar.

Lektorat: Volker Bombien, Köln
Korrektorat: Eike Nitz, Köln
Satz: III-satz, Husby, www.drei-satz.de
Umschlaggestaltung: Michael Oreal, Köln
Illustrationen: Nicole Britz, München
Produktion: Andrea Miß, Köln
Druck: fgb freiburger graphische betriebe; www.fgb.de

Dieses Buch ist auf 100% chlorfrei gebleichtem Papier gedruckt.

O’Reilly Verlag Balthasarstr. 81 50670 Köln kommentar@oreilly.de

Kapitel 1. Einführung

Vorwort

Es ist immer ein Wagnis, ein technisches Buch über ein Softwareprojekt zu schreiben, das sich noch im Betastadium befindet. Vor allem dann, wenn das Projekt sich so schnell entwickelt wie CouchDB. Als dieses Buch entstand, gab es CouchDB Version 0.10.1, aber es kann durchaus sein, dass Sie jetzt schon die Version 0.11.0 vorfinden, oder gar den Release 1.0. Zwar kann man in etwa sagen, was sich in zukünftigen Versionen ändern wird, jedoch wollte ich Sie nicht mit Vermutungen verwirren. Grundlegene Funktionalitäten werden sich jedoch nicht so schnell ändern, und erst recht nicht der Ansatz von CouchDB. Derzeit wird in einigen Projekten die Version 0.10.1 von CouchDB produktiv eingesetzt.

Das Buch, das Sie gerade in der Hand halten, ist als Einführung und Nachschlagewerk gedacht. Sie finden hier die wesentlichen Dinge zu CouchDB. CouchDB-Cracks werden sicherlich das ein oder andere vermissen, und sicherlich wird man als Leser auch zu bestimmten Themen noch mehr wissen wollen. Das Internet bietet einige Tutorials und Artikel zu CouchDB, und es wird in Zukunft auch noch mehr geben. Im Moment wird die Dokumentation von der CouchDB-Community diskutiert und überarbeitet.

Das Runde

Bevor wir uns mit dem Thema CouchDB näher beschäftigen, möchte ich noch von einem Erlebnis berichten. Meine Tochter Elena, erst süße 19 Monate alt, spielte erst eines von diesen pädagogischen Spielen. Vielleicht kennen Sie es auch: Dabei geht es darum, geometrische Figuren wie Würfel, Zylinder und Dreiecke durch entsprechende Öffnungen zu schieben. Ich sah, wie sie versuchte, den Zylinder in die Dreiecksform zu pressen. Natürlich tat sie das mit gebührendem Nachdruck. Was nicht passt, wird passend gemacht. Dabei ging mir ein Licht auf: Genau so muss es wohl sein, wenn wir in der Erwachsenen- oder Entwicklerwelt versuchen, etwas mit Mitteln zu lösen, die dafür einfach nicht gedacht sind. Es geht irgendwie. Es wird passend gemacht. Als meine Süße erkannte, dass der Zylinder in das Runde viel besser reinpasst, lachte Sie herzlich und war stolz. Es ging viel einfacher und fühlte sich viel natürlicher an. So ist es vielleicht auch mit CouchDB. Viele Webentwickler bedienen sich relationaler Datenbanken für die Lösung von Problemen, bei denen eine dokumentbasierte Datenbank wesentlich besser wäre. Und so stolz wie meine Tochter bei Ihrer Entdeckung war, bin ich auch stolz, einen Weg gefunden zu haben, die Daten in meiner Anwendung wesentlich natürlicher zu speichern und abzufragen. Ich freue mich darüber, dass ich sogar auf Middleware verzichten könnte. Ich habe sozusagen das Runde gefunden.

CouchDB

CouchDB ist eine dokumentbasierte Datenbank, was nicht gleichbedeutend mit einer Objektdatenbank oder gar einer objektrelationalen Datenbank ist. Denn die in CouchDB gespeicherten Dokumente haben von ihrer Definition her keine Beziehungen untereinander. Beziehungen werden nur explizit in Abfragen bzw. in der Applikation hergestellt. Dabei können die Dokumente jede komplexe Datenstruktur annehmen.

Anders als bei bisher bekannten Datenbanksystemen und vor allem im Gegensatz zu relationalen Datenbanken werden Abfragen in CouchDB nicht über SQL definiert. Während bei anderen Datenbanksystemen versucht wird, alle Prozesse hinter der SQL-Abfrage vor dem Benutzer zu verstecken, öffnet CouchDB diese Prozesse und erlaubt dem Entwickler, mehr Kontrolle über sie auszuüben. Aus diesem Grund ist es am Anfang sicherlich schwierig zu verstehen, warum es in CouchDB keine JOINS gibt oder warum sich CouchDB so oder so verhält. Gerade weil es sich dabei um Dinge handelt, die man vielleicht bisher als gegeben angesehen und deshalb nie über sie nachgedacht hat. Sobald man jedoch diesen Paradigmenwechsel überstanden hat, öffnet sich eine Tür, durch die Sie gehen sollten.

Das Entwickeln mit CouchDB ist erstaunlich einfach. Gerade für Webanwendungen ist es besonders geeignet. Bisher haben Sie vielleicht Ihre Anwendungen in PHP programmiert, die Daten in MySQL gespeichert und die Benutzeroberfläche in JavaScript und HTML/CSS gebaut. Mit CouchDB muss sich das nicht zwangsläufig ändern, jedoch können Sie die Zeit, die Sie für bestimmte Bausteine benötigen, anders verteilen. Wenn Sie zum Beispiel Ihre Anwendung in PHP geschrieben und Ihre Datenbankanfragen in SQL definiert haben, können Sie mit CouchDB auf PHP und SQL verzichten – wenn Sie mögen. Damit geht einher, dass bestimmte Logiken nun in CouchDB selbst implementiert werden müssen, jedoch der Gewinn ist immens. Zum einen brauchen Sie im Kopf nicht mehr zwischen verschiedenen Sprachen hin und her zu schalten, zum anderen können Sie sich hauptsächlich auf die Implementierung der Benutzeroberfläche konzentrieren. Die Benutzeroberfläche würde die Daten direkt aus der Datenbank beziehen, und zwar über einfache HTTP-Requests. Die kennen Sie vielleicht schon aus Projekten, bei denen Sie mit AJAX-Techniken zu tun hatten. Von der Datenbank erhalten Sie die Daten im JSON-Format, was sich nahtlos in JavaScript verarbeiten lässt. Man kann sogar davon ausgehen, dass Sie über diesen Weg eine Menge Zeit einsparen können. Das ist einer der Gründe dafür, dass Entwickler, die mit CouchDB arbeiten, so unglaublich entspannt sind. Time to Relax. Nutzen Sie das Buch und die darin enthaltenen Codebeispiele, um sich selbst ein Bild zu machen. Die enthaltene Beispielanwendung beschreitet den beschriebenen Weg und zeigt, wie Sie sogar die Anwendung selbst in der Datenbank speichern können.

Heutzutage kommen in Programmiersprachen wie Java, Ruby oder PHP Abstraktionsebenen zum Einsatz, die die Aufgabe haben, native Objekte auf Tabellen in der relationalen Datenbank abzubilden. Jedoch gibt es immer wieder Situationen, in denen zum Beispiel ein ActiveRecord von Ruby keine ausreichende Lösung bietet, womit man dann wieder bei SQL angelangt ist.

Es ist wichtig zu erwähnen, dass CouchDB nicht als eine Art Ersatz für relationale Datenbanken zu sehen ist. Jeder Ansatz hat seine Stärken und Schwächen. Ihre Aufgabe sollte es sein, für jeden Anwendungsfall das passende Werkzeug zu verwenden. Derzeit werden relationale Datenbanken für alles Mögliche eingesetzt, wobei dieser Datenbanktyp nicht immer seine Stärken ausspielen kann.

Relationale Datenbanken sind nicht dafür gemacht, verschieden strukturierte Dokumente zu speichern. Vielmehr liegt ihre Stärke darin, dynamische Abfragen auf fest strukturierte Daten schnell und gut zu verarbeiten. Das ist zum Beispiel bei wissenschaftlichem Arbeiten der Fall, wo Sie verschiedene Abfragen über eine einmal erhobene Datenmenge durchführen müssen, um bestimmte Aussagen über dies und das treffen zu können. Auch bei der Führung von Bankkonten oder Ähnlichem können relationale Datenbanken ihre Stärken ausspielen. Wenn Sie jedoch eine Anwendung haben, bei der es naturgemäß um Dokumente geht, warum setzen Sie dann keine darauf spezialisierte Datenbank ein? Dokumente sind zum Beispiel Blogeinträge, Kontaktdaten, E-Mails, Webseiten, Kommentare, Videos, Bilder und so weiter.

Die Stärken von CouchDB liegen unter anderem darin, Dokumente effizient zu speichern und diese zu verarbeiten. Da Dokumente von Natur aus nicht immer gleich strukturiert sind, ist es schwierig, sie in relationalen Datenbanken abzubilden.

Natürlich gibt es mittlerweile standardisierte Wege, mit denen Sie Objekte unterschiedlicher Struktur in einer relationalen Datenbank speichern und abfragen können. Viele setzen dafür zum Beispiel das »Entity-Attribute-Value«-Modell (EAV) ein, was jedoch wider die Natur von SQL-Datenbanken ist: Zum einen müssen Sie die Zeilen beim Laden wieder in Spalten umwandeln, zum anderen werden Sie um riesige ineffiziente SQL-Statements nicht herumkommen.

Wenn Sie zum Beispiel eine Anwendung schreiben, bei der Sie Daten zu Patienten in Krankenhäusern speichern müssen, warum nicht einfach im Dokument des Patienten diese Daten hinterlegen? Diese können jedes Mal anders ausfallen. Und das macht auch noch Spaß. CouchDB liefert dafür den richtigen Ansatz. CouchDB ist schemalos. Das bedeutet, dass es keine explizite Definition von Datenstrukturen gibt. Im Grunde genommen können Sie jedes Objekt mit einer beliebigen Struktur in der Datenbank speichern. Das ist ein weiterer Relax-Faktor, der Ihnen große Flexibiltät einräumt und dabei helfen kann, eine Menge Zeit zu sparen.

CouchDB selbst ist in Erlang implementiert. Erlang ist eine funktionale Programmiersprache, die für ihre Eigenschaften in verteilten Systemen und bei paralleler Verarbeitung bekannt ist. Diese Eigenschaften hat CouchDB geerbt, und es setzt sie konsequent um. Kombiniert mit anderen Designentscheidungen macht Erlang CouchDB zu einer robusten Anwendung, die sehr gut in verteilten Systemen einsetzbar ist.

Konventionen

Die folgenden typographischen Konventionen werden in diesem Buch benutzt:

Kursivschrift

Kennzeichnet neue Begriffe, URLs, Dateinamen, Dateierweiterungen, Verzeichnisse, Befehle und Namen von Programmen. So wird ein Pfad im Dateisystem z.B. als /usr/local dargestellt.

Nichtproportionalschrift

Kennzeichnet Codebeispiele sowie Befehle, die auf der Kommandozeile einzugeben sind, außerdem einzelne Hervorhebungen im Text, Schlüsselwörter und Modulnamen.

Danksagung

An der Entwicklung des Buches haben viele Menschen mitgewirkt. Als Erstes möchte ich meiner Frau Yvonne und meiner Tochter Elena für ihre Unterstützung und ihr Verständnis danken. Unzählige Wochenenden habe ich mich in ein Café zurückgezogen, um auf Port 5984 für sie unverständliche Dinge zu tun. Ohne Euch gäbe es dieses Buch nicht. Danke, Yvonne. Danke, Elena. Knutsch! Ganz besonders möchte ich mich auch bei Volker Bombien vom O’Reilly Verlag bedanken, der mich bei meinem ersten Buch sicher durch das Fahrwasser geführt hat. Viele Anregungen, Ideen und Hilfestellungen von ihm haben dieses Buch erst möglich gemacht. Danke, Volker. CouchDB ist für mich ein neues Thema gewesen, dem ich mich nicht so hätte annähern können, wenn ich nicht die tatkräftige Unterstützung von Jan Lehnardt gehabt hätte. Er ist als einer der Hauptentwickler von CouchDB ziemlich beschäftigt und hat sich trotzdem die Zeit genommen, auf meine Fragen zu antworten und mich fachlich zu unterstützen. Nicht unerwähnt sollte auch J. Chris Anderson bleiben, der mir mehrere Male weitergeholfen hat. Danke, Jan. Danke, Chris. Danken möchte ich auch Ingo, Norbert, Marco und Volker, die mir bei der einen oder anderen Fragestellung zur Seite standen, sich meinen Text in unzähligen Versionen durchlesen mussten und stets als Sparringspartner zur Verfügung standen. Zuletzt möchte ich natürlich der gesamten CouchDB-Community danken. Es ist wirklich großartig, wie schnell offene Fragen geklärt werden konnten. Die Mailinglisten kann ich nur jedem CouchDB-Benutzer ans Herz legen.

Kapitel 2. Installation

CouchDB installieren

In diesem Kapitel erfahren Sie, wie Sie CouchDB auf Ihrem System installieren können. Zuvor muss jedoch erwähnt werden, dass CouchDB sich wesentlich schneller entwickelt als andere Projekte. So kann es passieren, dass Installationsanleitungen schnell veralten. Die hier beschrieben Schritte beziehen sich auf die Version 0.10.x.

Installation unter Linux

Die Installation unter verschiedenen Linux-Derivaten unterscheidet sich von Distribution zu Distribution. Im Folgenden werden die gängigsten Varianten vorgestellt. Sollte die gewünschte Distribution nicht darunter sein, haben Sie immer noch die Möglichkeit, die jeweiligen Quellcodes zu kompilieren.

Debian/Ubuntu

Der einfachste Weg bei Debian/Ubuntu geht über den Paketmanager Aptitude. Dazu rufen Sie die Konsole auf und führen folgende Befehle nacheinander aus:

sudo aptitude update
sudo aptitude install couchdb

Nach Eingabe des Passworts und der Bestätigung des Vorgangs wird CouchDB auf dem System installiert und als Daemon gestartet. Dabei werden automatisch der Benutzer couchdb angelegt und die passenden Rechte gesetzt.

Novell Suse

Einfach und unkompliziert geht es auch bei openSuSe/SLED. Hier werden fertige One-Click-Install-Pakete angeboten. Diese finden Sie auf der Website http://software.opensuse.org.

RedHat

Zur Installation unter RedHat werden die EPEL (Extra Packages for Enterprise Linux) benötigt. Installieren Sie zunächst die benötigten Pakete und Abhängigkeiten. Nutzen Sie dafür den Paketmanager yum.

yum install ncurses-devel openssl-devel icu libicu-devel js js-devel curl-devel erlang

Achtung

Unter RedHat 4 werden die Pakete js-devel und erlang nicht durch die EPEL abgedeckt, so dass sie unter Umständen kompiliert werden müssen. Für weitere Details schauen Sie sich den Teil über das Kompilieren des Quellcodes an.

Danach müssen Sie den Quellcode von CouchDB herunterladen, entpacken und kompilieren. Hier sehen Sie die URL für den aktuellen Quellcode:

wget http://apache.mirroring.de/couchdb/0.10.1/apache-couchdb-0.10.1.tar.gz

Entpacken Sie den Quellcode und wechseln Sie in das entsprechende Verzeichnis.

tar -xvfz apache-couchdb-0.10.1.tar.gz
cd apache-couchdb-0.10.1

Führen Sie folgende Befehle als Root-Benutzer nacheinander aus:

./bootstrap
./configure
make
make install

Legen Sie einen Benutzer an und setzen Sie die Berechtigungen:

adduser -r --home /usr/local/var/lib/couchdb -M --shell /bin/bash
--comment “CouchDB Administrator” couchdb

Nun sollten Sie CouchDB direkt starten können.

sudo -u couchdb couchdb

Darüber hinaus können Sie CouchDB auch als Daemon registrieren, der automatisch beim Booten gestartet wird:

sudo ln -s /usr/local/etc/rc.d/couchdb /etc/init.d/couchdb
sudo chkconfig --add couchdb

Installation unter Mac OS X

Der einfachste Weg, um CouchDB auf einem Mac zu installieren, ist über das Bundle CouchDBX. CouchDBX ist ein inoffizieller Release von Apache CouchDB. Es unterstützt nur Intel-basierte MACs ab Mac OS X 10.5 Leopard aufwärts. Das Bundle enthält alle wichtige Bestandteile, die zum Betrieb von CouchDB erforderlich sind:

Erlang

ICU

SpiderMonkey

Apache CouchDB

Gleich nach dem Download kann das Programm ausgeführt werden. Der folgende Screenshot zeigt das mit CouchDB gelieferte Utility Futon.

Dieses Paket eignet sich vor allem dazu, CouchDB schnell auf einem Mac zu installieren und ein wenig damit zu experimentieren.

CouchDB lässt sich auch mit MacPorts installieren. Hierzu müssen die Xcode Developer Tools installiert sein. Um die Installation von CouchDB zu starten, rufen Sie das Terminalfenster auf und geben folgenden Befehl ein:

sudo port install couchdb

Abbildung 2.1 CouchDBX

Ähnlich wie bei diversen Linux-Derivaten installiert der Paketmanager MacPorts CouchDB mit den dazugehörigen Abhängigkeiten auf Ihrem Mac. Die letzte Nachricht der Installationsroutine ist »cleaning couchdb«, danach sollten Sie wieder die Befehlseingabe erhalten. Um CouchDB automatisch bei jedem Bootvorgang zu starten, können Sie über folgende Zeile CouchDB als Service registrieren:

sudo launchctl load -w /Library/LaunchDaemons/org.apache.couchdb.plist

Sollten Sie sich dafür entscheiden, CouchDB manuell zu starten und zu stoppen, können Sie das mit folgenden Befehlen tun:

sudo launchctl start org.apache.couchdb

und

sudo launchctl stop org.apache.couchdb

Installation unter Windows

Seit der Version 0.10.0 steht ein Installer für Windows zur Verfügung. Auch für kommende Versionen von CouchDB wird es vermutlich einen Binary Installer geben. Für Version 0.10.0 können Sie diesen unter folgender URL herunterladen:

http://people.apache.org/~mhammond/dist/0.10.0/

Starten Sie das Installationsprogramm wie gewohnt. Sobald die Installationsroutine erfolgreich durchgelaufen ist, können Sie das Programm starten. Klicken Sie dazu auf Start und wählen Sie unter Programme den Ordner Apache CouchDB aus. Klicken Sie nun auf Start CouchDB. Daraufhin sollte sich ein Eingabeaufforderungsfenster öffnen.

Abbildung 2.2 Das Fenster beim Starten unter Windows

Nun sollte CouchDB gestartet sein.

Die Ausführung der mitgelieferten Test Suite schlägt unter Windows fehl. Hierbei handelt es sich um ein Zugriffsproblem, bei dem CouchDB versucht, eine Datei zu löschen, die noch in Gebrauch ist.

Der Installer unterstützt es derzeit nicht, CouchDB als Dienst zu starten. Jedoch können Sie das im Nachhinein, unter Verwendung entsprechender Werkzeuge, ermöglichen. CouchDB lässt sich auch unter Windows kompilieren. Die benötigten Werkzeuge und die Abhängigkeiten unterscheiden sich jedoch nicht von denen, die unter einem Linux-System erforderlich währen.

Kompilieren des Quellcodes

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!