Database Reference
In-Depth Information
wir noch einmal die drei Begriffe, die Sie aus relationalen Datenbanken kennen dürften:
SELECT, FROM, JOIN und WHERE. CouchDB kennt nun aber keine Tabellen, in denen
gleichförmige Datensätze gespeichert werden. Nachdem Sie eine Datenbank in CouchDB
angelegt haben, werfen sie alle Daten in die Datenbank. Dieser Mangel an Tabellen zeigt
auch, warum wir kein FROM und JOIN brauchen.
Schauen wir uns nun das SELECT an. In SQL beschreibt es die Spalten, die wir aus einer
Tabelle haben möchten, meist mit einer Bedingung, bezogen auf einen Datensatz. SELECT
name FROM autohaus WHERE stadt ='Berlin' . Das passiert in einer relationalen Daten-
bank: Die Datensätze der Tabelle werden nacheinander gelesen, und alle Datensätze, bei
denen die Hauptstadt angegeben ist, werden ausgegeben. CouchDB hat jedoch keine Mög-
lichkeit für Ad-Hoc-Abfragen. Hier wird eine Abfrage innerhalb von CouchDB geschrie-
ben, die nach dem Prinzip „Passt/Passt nicht“ funktioniert. Diese Abfragen sind standard-
mäßig in JavaScript programmierbar, andere Sprachen können aber eingebunden werden.
Ein Datensatz wird gegen diese Funktion geworfen, und wenn die Abfragen passen, wird
ein selbstdefiniertes Key-Value-Paar ausgegeben - wenn nicht, dann nicht. Da diese Abfra-
gefunktionen keinerlei Seiteneffekte auf andere Daten haben, sondern nur auf den Daten-
satz, der gerade überprüft wird, können die Abfragen parallel unternommen werden. Das
ist übrigens auch einer der Gründe, warum die CouchDB in Erlang programmiert ist, einer
Sprache, die für die parallele Abarbeitung entworfen wurde. Ein einfaches Beispiel für so
eine Abfrage lautet: Function(doc): { if(doc.stadt=='Berlin') {emit doc._id,doc} };
Die Funktion bekommt als Argument den gerade zu prüfenden Datensatz. Im Funktions-
rumpf wird überprüft, ob das Element stadt eines Dokuments (also Datensatzes) mit dem
Wert Berlin übereinstimmt, wenn ja, dann wird ein Key-Value-Objekt mit dem Schlüssel
doc._id (Der ID des aktuell untersuchten Dokuments) und dem Inhalt (dem Dokument)
ausgegeben. Diese Liste mit den Key-Value-Paaren kann dann in einer zweiten Phase noch
einmal reduziert werden. Diese zwei Schritte nennen sich MAP und REDUCE.
Map/Reduce
Die Funktion, die zur Selektion eines Datensatzes beiträgt, nennt sich Map . Hier ein Bei-
spiel, das alle Autohäuser auflistet, die ihren Sitz in Berlin haben:
Function(doc) { // doc= jedes Dokument in der
// Datenbank
if(doc.stadt=="Berlin") {
// Yeah, Berlin
emit (1,doc.name)
// der Key ist hier unwichtig
}
Search WWH ::




Custom Search