Sebastian Nanek
snanek posiadający konto w domenie gmail.com
CouchDB to nierelacyjny, zorientowany na dokumnety, system zarządzania bazami danych, napisany w języku Erlang, nastawiony na wysoką dostępność (wykorzystanie algorytmu Map/Reduce) i replikowalność danych (automatyczna replikacja). W przeciwieństwie do systemów relacyjnych, pojedynczy rekord nie jest związany z określoną strukturą danych - zamiast tego ma on postać tablicy haszującej zapisanej w formacie JSON, w której wartości mogą być dowolnego typu prostego - w tym także typu tablicowego.
W świecie oprogramowania komercyjnego, mimo stosunkowo niskiego numeru wersji (0.10), system ten zyskuje coraz większą popularność. Stosują go m.in. Engine Yard, czy nawet BBC [9]. Obecnie (czerwiec 2010), trwają prace edytorskie nad pierwszymi wydaniami książek pomocnych w nauce i zrozumieniu CouchDB.
Instalacja pakietu CouchDB w systemie operacyjnym GNU/Linux Ubuntu:
$sudo aptitude install couchdb
Uruchomienie CouchDB z poziomu konta superużytkownika:
$ sudo couchdb
Apache CouchDB is running as process 31654. Time to relax.
Alternatywnie, można program uruchamiać z poziomu konta zwykłego użytkownika, wcześniej upewniając się, że użytkownik będzie miał dostęp do zapisu w katalogu /var/lib/couchdb/0.8.0 (lub innym, odpowiadającym ustawieniom CouchDB i lokalnemu środowisku systemowemu).
Sprawdzenie poprawności instalacji
Z konsoli:
$curl -X PUT http://127.0.0.1:5984/albums
{„ok”:true}
Przy użyciu przeglądarki internetowej:
Wejście na stronę www:
zwraca:
{„couchdb”:„Welcome”,„version”:„0.8.0-incubating”}
W domyślnej instalacji serwera CouchDB znalazło się także miejsce na wizualny panel administracyjny. Dostęp do niego można uzyskać, wchodząc pod adres:
W CouchDB istnieje możliwość wyszukiwania i agregowania danych.
Przykładowo, aby wyszukać dokuemnty, których wartość parametru „test” równa się „titletest”, należy po utworzeniu widoku test
o treści:
function(doc) { if(doc.test == "titletest") { emit( doc.test, doc ); } }
i wejściu na adres:
http://localhost:5984/testdb/_view/test/tt?count=10&group=true
Otrzymujemy następujący rezultat:
{"total_rows":1,"offset":0,"rows":[ {"id":"test","key":"titletest","value":{"_id":"test","_rev":"1510238268","test":"titletest","title":"tretete"}} ]}
CouchDB jest dojrzałym systemem baz danych, nastawionym na łatwość programowania, wysoką wydajność i sprawną replikację danych. Jest to także dobra alternatywa dla systemów relacyjnych w sytuacji, kiedy w strukturze danych dominującą rolę odgrywa jedna klasa rekordów i nie potrzeba skomplikowanych operacji raportowych. Osobiście, będę chciał zastosować ten system w aplikacji internetowej, w której zdecydowanie przeważać będą operacje odczytu danych.
Celem projektu jest napisanie prostej aplikacji w oparciu o zorientowany na dokumenty system zarządzania bazami danych CouchDB. Aplikacja umożliwia tworzenie dokumentów (rekordów).
Całość zostanie zaimplementowana w języku Ruby, z wykorzystaniem mikroframeworka do tworzenia aplikacji internetowych SinatraRB[4]. W tym przypadku framework zapewnia w zasadzie jedynie funkcjonalność dynamicznego serwera http i mapowania adresów na odpowiednie akcje (FrontController
). Do komunikacji została wykorzystana przykładowa biblioteka klienta, pochodząca z wiki twórców CouchDB[4].
Aby uprościć tworzenie warstwy widoku aplikacji, zostaną wykorzystane następujące biblioteki:
System umożliwia:
przeglądanie listy dostępnych dokumentów
tworzenie nowego dokumentu
przeglądanie dokumentów i usuwanie bieżącego dokumentu
Kod programu: keep_informed.tar.gz
Do uruchomienia potrzebny jest pakiet CouchDB działający na porcie 5987 maszyny lokalnej (lub wedle konfiguracji) oraz 'rubygems' w wersji 1.3.6 wraz z gemem 'sinatra' w wersji 1.0.0.
Aplikację uruchamia się przy użyciu komendy w katalogu głównym źródeł:
ruby app.rb
i wejściu pod adres:
(lub stosownie do parametrów uruchomienia).
# based upon a document at http://wiki.apache.org/couchdb/Getting_started_with_Ruby require 'net/http' module Couch class Server def initialize(host, port, options = nil) @host = host @port = port @options = options end def delete(uri) request(Net::HTTP::Delete.new(uri)) end def get(uri) request(Net::HTTP::Get.new(uri)) end def put(uri, json) req = Net::HTTP::Put.new(uri) req["content-type"] = "application/json" req.body = json request(req) end def post(uri, json) req = Net::HTTP::Post.new(uri) req["content-type"] = "application/json" req.body = json request(req) end def request(req) res = Net::HTTP.start(@host, @port) { |http|http.request(req) } unless res.kind_of?(Net::HTTPSuccess) handle_error(req, res) end res end private def handle_error(req, res) e = RuntimeError.new("#{res.code}:#{res.message}\nMETHOD:#{req.method}\nURI:#{req.path}\n#{res.body}") raise e end end end
Jest to minimalistyczny klient, pozwalający na najbardziej niskopoziomową pracę z CouchDB. Istnieją dużo bardziej zaawansowane biblioteki dla wielu języków programowania[11].
Przykładowe wywołanie akcji pobierania dokumentu, aby go wyświetlić może wyglądać następująco:
request = COUCH.get("/#{CONFIGURATION['database']}/#{params['id']}") @document = JSON.load(request.body)
Gdzie params['id']
to przekazany do aplikacji identyfikator żądanego dokumentu