Open Source im professionellen Einsatz
Linux-Magazin Online Artikel/

CouchDB: Neue Datenbank fürs Web

Mal Ausspannen

29.09.2009

Relationale Datenbank war gestern. Viele Entwickler verwenden heute Datenbanken, die ohne SQL auskommen. Der zurzeit populärste Vertreter der Gattung ist CouchDB.

930

Wer sich in den letzten Jahren irgendwann einmal mit der Entwicklung von Webanwendungen beschäftigt hat, wird gemerkt haben, dass es in praktisch jedem Framework eine so genannte ORM-Schicht gibt. ORM bedeutet objekt-relationales Mapping, also die Zuordnung von auf höherer Programmierebene verwendeten Objekten auf die relationalen Strukturen einer Datenbank. Angesichts des Aufwands, unterschiedliche Welten zu vereinen, könnte es naheliegen, die Daten gleich als Objekt zu speichern, wie es zum Beispiel db4o macht.

Einen etwas anderen Weg geht CouchDB [1], das die Struktur der gespeicherten Dokumente in den Mittelpunkt stellt. Insbesondere müssen die gespeicherten Daten nicht einer vorab erstellten Definition genügen, dem so genannten Schema, weshalb CouchDB auch als schema-lose Database bezeichnet wird. Die Flexibilität geht soweit, dass einzelne Dokumente sogar unterschiedliche Elemente/Felder enthalten dürfen. Als Netzwerkprotokoll verwendet CouchDB das vom Web bekannte HTTP und liefert Daten im JSON-Format aus, womit sich Webentwickler sofort zu Hause fühlen dürften. Gemäß dem REST-Prinzip, das Datendienste wiederum auf der Basis von HTTP realisiert, steht zum Speichern in der Datenbank die Operation PUT oder POST, zum Lesen das bekannte GET zur Verügung. Im einfachsten Fall sieht eine Abfrage so aus wie eine Web-URL: »http://localhost:5984/Datenbank/Ressource«. Eine Liste aller Datenbanken ist unter »http://localhost:5984/_all_dbs« zu finden.

Erlang verlangt

Doch bevor es um die Nutzung der CouchDB geht, noch ein paar Worte zur Installation. CouchDB ist in Erlang geschrieben, der ehemals hausinternen Sprache von Ericsson, die ebenfalls in letzter Zeit ziemlich gehypet wird. Das muss uns nicht weiter kümmern, man braucht allerdings zum Compilieren von CouchDB die Erlang-Umgebung, die für alle gängigen Distributionen in den Repositories enthalten ist.

Für diesen Artikel habe ich Debian Etch verwendet, das die Erlang-Version 12b3 mitbringt, die jedenfalls für CouchDB genügt. Einfach »aptitude install erlang« eingeben und fertig, dito bei Ubuntu. Red-Hat-, Fedora, CentOS- und Suse-Benutzer verwenden stattdessen einfach »yum«. Nach dem Configure-Script folgen »make« und »make install«, was unter anderem einen Benutzer »couchdb« in der Passwort-Datei anlegt. Wer ohne Benutzerwechsel CouchDB starten möchte, kann sich selbst der Gruppe »couchdb« hinzufügen und den passenden Verzeichnissen Gruppenschreibrechte geben:

chmod -R g+w /usr/local/var/lib/couchdb/
chmod -R g+w /usr/local/var/log/couchdb/

Der Befehl »couchdb« startet schließlich die Datenbank, die ihre Meldungen direkt im Terminal ausgibt (Abbildung 1). Daemon-Mode und so weiter lassen sich über Kommandozeilenparameter festlegen.

Abbildung 1: In einem Terminal gestartet, gibt CouchDB seine Meldungen direkt aus.

Die Datenbank ist unter Port 5984 zu erreichen (von Haus aus nur unter der Localhost-Adresse), hinter der URL »http://localhost:5984/_utils« verbirgt sich ein brauchbares Web-Interface namens Futon. Dort lassen sich mit wenigen Klicks neue Datenbanken und in diesen wiederum CouchDB-Dokumente anlegen, verändern und löschen . Für neue Dokumente geben Sie entweder einen Wert für das spezielle Property »_id« ein, das den Datensatz eindeutig identifiziert, oder lassen die ID von CouchDB erzeugen. Außerdem enthält Futon eine eigene Seite für die Replikation der CouchDB (Abbildung 2).

Abbildung 2: Das CouchDB-Frontend Futon kann auch zur Replikation der Datenbank verwendet werden.

Sogar mit Telnet

Dank des einfachen Protokolls können Sie selbst über Telnet mit der Datenbank interagieren, wie die Seite ,,Couch in 15 Minutes" des CouchDB-Wikis [2] es demonstriert. Es ist nur beim Schreiben per PUT etwas mühsam, sich für jede Anfrage die Content-Length auszurechnen beziehungsweise die Zeichen zu zählen. Einfacher geht's in jedem Fall mit einer der etwa 15 Programmiersprachen, die das Wiki auflistet. Sollte die Lieblingssprache nicht dabei sein, dürfte ein passender Wrapper, der die HTTP-Requests kapselt und Nutzdaten in JSON ver- und entpackt, in wenigen Stunden geschrieben sein. Als Vorlage kann die Seite ,,Getting Started with PHP" dienen, die in etwa 20 Zeilen die einfache Klasse »CouchSimple« vorexerziert, in nur wenig Code auch noch eine etwas strukturiertere Alternative.

Eigentlich braucht man keine spezielle Library, um mit CloudDB zu arbeiten, aber weil die Datenbank ,,schema-los" ist, muss die Anwendung beziehungsweise eine Zwischenschicht die Integrität der Daten sicherstellen. Insofern wird hier die Aufgabe des objektrelationalen Mappings (ORM) nur auf eine andere Ebene verlagert oder gar nur mit einem anderen Namen versehen.

Wie die bereits erwähnte Wiki-Seite zeigt, gibt es in den Mainstream-Sprachen schon die Auswahl aus mehreren Bibliotheken. Der Kasten ,,Python und CouchDB-Kit" demonstriert die Verwendung einer der Python-Libraries.

Python und CouchDB-Kit

Am leichtesten installieren Sie das CouchDB-Kit mit EasyInstall, das Sie folgendermaßen herunterladen und installieren:

curl -O http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py -U setuptools

Der nächste Befehl installiert dann CouchDB-Kit, Simple-JSON und REST-Kit:

easy_install -U Couchdbkit
easy_install simplejson
easy_install restkit

Weil dann immer noch die Any-JSON-Library fehlte, das EasyInstall-Paket aber nicht funktionierte, habe ich sie von Hand aus dem Quellcode installiert. Dieses Beispiel demonstriert, wie man CouchDB-Kit verwendet:

>>> import couchdbkit as cdb
>>> server = cdb.Server()
>>> server.get_or_create_db("movies")
<Database movies>
>>> db = server.get_or_create_db("movies")
>>> for record in db:
...    record
>>> class Greeting(cdb.Document):
...       author = cdb.StringProperty()
...       movie = cdb.StringProperty()
...       date = cdb.StringProperty()
>>> class Actor(cdb.Document):
...     name = cdb.StringProperty()
>>> cdb.contain(db, Actor)
>>> actor = Actor(name = "george clooney")
>>> actor.save()

Abbildung 3 zeigt eine einfache Abfrage im Python-Interpreter. Besser als handgestrickte Abfragen funktionieren auch mit CouchDB-Kit im Artikel vorgestellten Views, für die es eine passende API gibt.

Abbildung 3: Eine Datenbankabfrage in wenigen Zeilen Python.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.