W zeszłym tygodniu miałem przyjemność uczestniczyć w DevMeetings.pl, czyli bezpłatnych spotkaniach dla deweloperów. Jest to warta promowania inicjatywa całodniowych, prowadzonych na bardzo wysokim poziomie szkoleń, które odbywają się w soboty w kilku miastach Polski (Poznań, Kraków, Warszawa). Tematyka kręci się głównie wokół serwerowego javascriptu i technologii z nim związanych. Tym razem szkolenie dotyczyło baz NoSQL czyli "Not only SQL".

NoSQL

Spotkaliśmy się na 16 piętrze Millenium Plaza w Warszawie (genialny widok) w sobotę rano. Po dwugodzinnym, skondensownym wstępie teoretycznym podzieliliśmy się na kilkuosobowe grupy, by zająć się przewidzianym na resztę dnia kodowaniem. Tym razem celem było wzbogacenie napisanego w node.js na poprzednim DevMeetingu, prostego klona API twittera o nierelacyjną bazę danych. Do wyboru były: MongoDB, Cassandra, Redis oraz CouchDB. Wylądowałem w zespole, który używał tej ostatniej.

Większość czasu zjadła nam migracja ze źródłowej bazy w MySQLu do CouchDB. Początkowo wydawało się, że obsługa MySQL w nodzie jest dramatycznie wolna, przyczyna długiej migracji leżała jednak gdzie indziej i mogę ją streścić w jednym zdaniu: Zawsze zakładaj indeksy na bazie. Plik który otrzymaliśmy ich nie miał, co powodowało problemy z szybkością wyszukiwania danych. Synchroniczność noda dała o sobie tutaj również znać. Kolega z zespołu po zakończeniu migracji zamiast 10 000 rekordów, miał ich w bazie tylko około 6 tysięcy. Gdy uruchomił migrację jeszcze raz otrzymał ich 2 tysiące. Podobnie jak podczas Node Knockout, zapomnieliśmy o asynchroniczności. Po prostu skrypt zdążył pobrać dane z MySQLa i uruchomić wywołania zwrotne (callbacks) zapisujące je do CouchDB, a następnie (gdy callbacki wciąż się wykonywały w osobnych wątkach) natrafiał na instrukcję zakończenia przetwarzania. Ostatecznie rzutem na taśmę udało nam się zaimplementować minimalną liczbę funkcji. Nie wszystkim zespołom to się udało, ale trzeba przyznać, że ci, którzy wybrali Redisa nie mieli z tym większych problemów.

Parę słów o CouchDB

CouchDB posiada RESTowy interfejs dostępu do danych. Jest on prosty, gdy wystarczy nam pobranie prostych danych. Jeśli chcemy jednak wykonać skomplikowane zapytanie, musimy naszą bazę odpowiedni przygotować i utworzyć widok, przy pomocy którego wywołujemy zapytanie. Powoduje to, że dla osób, które mają doświadczenie ze zwykłymi bazami relacyjnymi, dużo prostsze do nauki od CouchDb jest chociażby MongoDB, które pozwala na używanie zapytań, podobnych do tych w SQLu. Wygląda jednak na to, że dobrze opanowane widoki mogą stać się całkiem niezłą bronią w walce o szybkośc odczytu.

Opinia o szkoleniu

Warto było spędzić ponad 10 godzin na praktycznym poznawaniu CouchDB; nic tak nie motywuje do nauki jak zapalona grupa osób wokół Ciebie i konkretny problem do rozwiązania. Mimo, że na sali był spory przekrój programistów od frontendowych Javascriptowców, po ludzi programującyh w Javie i C, to niewiele osób przyznało się do korzystania z baz NoSQL. Jedna osoba wdrożyła Redisa, kilka Mongo, nikt nie bawił się Cassandrą. Nawet prowadzący (świetnie tłumaczący David de Rosier) przyznał się, że nie ze wszystkimi z tych baz pracował. Tak więc nierelacyjne bazy danych kryją przed nami wiele tajemnic i można sporo odkryć, poznając je. DevMeeting i Node Knockout, to świetne okazje by się ich nauczyć. Jeśli będziesz miał okazję przejść się na DevMeeting, nie wahaj się, tylko idź. Nie pożałujesz.