NoSQL był jednym z najczęściej poruszanych tematów w ciągu ostatnich kilku miesięcy. Ten samouczek wprowadzi Cię w CouchDB, implementację NoSQL i nauczy Cię, jak zacząć korzystać z platformy.
Co to jest NoSQL?
NoSQL jest wolny od schematów — nie musisz z góry decydować o strukturze.
NoSQL [nie tylko SQL ] to ruch w kierunku magazynów dokumentów, które nie wykorzystują modelu relacyjnego. Podstawowa zmiana paradygmatu dotyczy sposobu przechowywania danych. Na przykład, gdy musisz przechowywać dane o fakturze, w RDBMS musisz destylować te informacje w tabele, a następnie użyć języka po stronie serwera, aby przekształcić te dane z powrotem w rzeczywiste obiekty. Z drugiej strony w NoSQL po prostu przechowujesz fakturę. NoSQL jest wolny od schematów, co oznacza, że nie musisz projektować tabel i struktury z góry — możesz po prostu zacząć przechowywać nowe wartości.
Kontynuując przykład faktury, niektóre faktury mogą zawierać numer VAT, inne nie. W RDBMS musisz powiedzieć swojej tabeli, aby najpierw zaakceptowała numer VAT, a następnie, że może być null. Jednak w NoSQL możesz po prostu przechowywać faktury z lub bez numeru VAT — nie ma schematu. Pamiętaj, że NoSQL nie jest srebrną kulą. Jeśli Twoje dane są naprawdę relacyjne, trzymanie się RDBMS będzie właściwym wyborem.
Odpytywanie baz danych NoSQL
MapReducing ma przewagę nad zapytaniami SQL, ponieważ zadanie map/reduce może być rozłożone na wiele węzłów, co nie jest możliwe w RDBMS.
Bazy danych NoSQL używają map/reduce do wykonywania zapytań i indeksowania bazy danych. W RDBMS uruchamiasz zapytanie łączące wiele tabel, aby najpierw utworzyć pulę danych, a następnie zapytanie tworzy zestaw wyników, podzbiór ogólnych danych. W NoSQL używasz map/reduce, aby utworzyć „widok” (podobny do zestawu wyników), ten widok jest podzbiorem ogólnych danych.
Mapa zasadniczo wyodrębnia dane i redukuje agregację danych. Im bardziej zaznajomisz się z RDBMS, tym trudniej będzie Ci ogarnąć mapę/redukcję. MapReducing korzyści w stosunku do zapytań SQL, ponieważ zadanie map/reduce może być rozłożone na wiele węzłów, co nie jest możliwe w RDBMS. Dodanie nowego rekordu do bazy danych nie zawsze oznacza całkowite ponowne uruchomienie zadania mapy/redukcji.
Przedstawiamy CouchDB
Kilka faktów na temat CouchDB, o których warto wiedzieć:
- CouchDB to zorientowana na dokumenty baza danych JSON napisana w języku Erlang.
- Jest to wysoce współbieżna baza danych zaprojektowana z myślą o łatwej replikacji poziomej na wielu urządzeniach i odporna na awarie.
- Jest częścią generacji baz danych NoSQL.
- Jest to projekt fundacji Apache o otwartym kodzie źródłowym.
- Pozwala aplikacjom na przechowywanie dokumentów JSON za pośrednictwem interfejsu RESTful.
- Wykorzystuje map/reduce do indeksowania i przeszukiwania bazy danych.
Główne zalety CouchDB
- Dokumenty JSON - Wszystko przechowywane w CouchDB sprowadza się do dokumentu JSON.
- Interfejs RESTful - Od tworzenia przez replikację do wstawiania danych, każde zadanie zarządzania i danych w CouchDB może być wykonane przez HTTP.
- Replikacja N-Master - Możesz korzystać z nieograniczonej liczby „masterów”, tworząc bardzo interesujące topologie replikacji.
- Zbudowany dla trybu offline - CouchDB może replikować się na urządzenia (takie jak telefony z Androidem), które mogą przejść do trybu offline i obsługiwać synchronizację danych, gdy urządzenie jest ponownie online.
- Filtry replikacji - Możesz dokładnie filtrować dane, które chcesz replikować do różnych węzłów.
Łączenie wszystkiego w całość
CouchDB to baza danych zaprojektowana do działania w dzisiejszym Internecie.
CouchDB pozwala na napisanie aplikacji po stronie klienta, która komunikuje się bezpośrednio z Couch bez potrzeby stosowania warstwy środkowej po stronie serwera, co znacznie skraca czas programowania. Dzięki CouchDB możesz łatwo obsługiwać popyt, z łatwością dodając więcej węzłów replikacji. CouchDB pozwala na replikację bazy danych do klienta, a dzięki filtrom możesz nawet replikować dane konkretnego użytkownika.
Posiadanie bazy danych przechowywanej lokalnie oznacza, że aplikacja po stronie klienta może działać prawie bez opóźnień. CouchDB zajmie się za Ciebie replikacją do chmury. Twoi użytkownicy mogą uzyskać dostęp do swoich faktur na telefonie komórkowym i wprowadzać zmiany bez zauważalnych opóźnień, a wszystko to w trybie offline. Gdy połączenie jest obecne i możliwe do użycia, CouchDB automatycznie zreplikuje te zmiany do Twojej chmury CouchDB.
CouchDB to baza danych zaprojektowana do działania w dzisiejszym Internecie dla współczesnych aplikacji typu desktop i podłączonych urządzeń, za pośrednictwem których uzyskujemy dostęp do Internetu.
Krok 1 — Instalacja CouchDB
Najłatwiejszym sposobem na uruchomienie i uruchomienie CouchDB w twoim systemie jest przejście do CouchOne i pobranie dystrybucji CouchDB dla twojego systemu operacyjnego - w moim przypadku OSX. Pobierz plik zip, rozpakuj go i upuść CouchDBX w folderze moich aplikacji (instrukcje dla innych systemów operacyjnych na CouchOne).
Na koniec otwórz CouchDBX.
Krok 2 — Witamy w Futon
Po uruchomieniu CouchDB powinieneś zobaczyć panel sterowania Futon w aplikacji CouchDBX. Jeśli nie możesz, możesz uzyskać dostęp do Futon za pomocą przeglądarki. Patrząc na dziennik, CouchDBX mówi nam, że CouchDB został uruchomiony pod adresem http://127.0.0.1:5984/
(może być inny w twoim systemie). Otwórz przeglądarkę i przejdź do http://127.0.0.1:5984/_utils/
i powinieneś zobaczyć Futon.
Przez resztę tego samouczka będę używał Futona w Firefoksie. Będę też miał otwarty Firebug i widok konsoli, aby zobaczyć wszystkie żądania HTTP wysyłane za kulisami przez Futon. Jest to przydatne, ponieważ Twoja aplikacja może robić wszystko, co robi Futon. Chodźmy dalej i stwórzmy bazę danych o nazwie mycouchshop
.
Wtyczka jQuery CouchDB
Futon faktycznie używa wtyczki jQuery do interakcji z CouchDB. Możesz zobaczyć tę wtyczkę na http://127.0.0.1:5984/_utils/script/jquery.couch.js
(pamiętaj, że twój port może być inny). Daje to świetny przykład interakcji z CouchDB.
Krok 3 — Użytkownicy w CouchDB
CouchDB domyślnie jest całkowicie otwarty, dając każdemu użytkownikowi uprawnienia administratora do instancji i wszystkich jej baz danych. To jest świetne dla rozwoju, ale oczywiście złe dla produkcji. Przejdźmy dalej i skonfigurujmy administratora. W prawym dolnym rogu zobaczysz „Witamy na przyjęciu administracyjnym! Wszyscy są administratorami! Napraw to”.
Śmiało i kliknij napraw to i podaj sobie nazwę użytkownika i hasło. Tworzy to konto administratora i daje anonimowym użytkownikom dostęp do operacji odczytu i zapisu we wszystkich bazach danych, ale bez uprawnień konfiguracyjnych.
Więcej o użytkownikach
W CouchDB nierozsądne byłoby tworzenie jednego superużytkownika i zmuszanie go do wykonywania wszystkich operacji odczytu/zapisu.
Użytkownicy w CouchDB mogą być początkowo nieco mylący, zwłaszcza jeśli jesteś przyzwyczajony do tworzenia jednego użytkownika dla całej aplikacji, a następnie samodzielnego zarządzania użytkownikami w tabeli użytkowników (nie w tabeli użytkowników MySQL). W CouchDB nierozsądne byłoby utworzenie jednego superużytkownika i zlecanie temu użytkownikowi całego odczytu/zapisu, ponieważ jeśli Twoja aplikacja działa po stronie klienta, poświadczenia tego superużytkownika będą widoczne w kodzie źródłowym JavaScript.
CouchDB ma wbudowane tworzenie użytkowników i uwierzytelnianie. Możesz tworzyć użytkowników za pomocą wtyczki jQuery za pomocą $.couch.signup()
. Zasadniczo stają się oni użytkownikami twojego systemu. Użytkownicy to tylko dokumenty JSON, jak wszystko inne, więc możesz przechowywać dowolne dodatkowe atrybuty, takie jak na przykład e-mail. Następnie możesz użyć grup w CouchDB, aby kontrolować, do jakich dokumentów każdy użytkownik ma dostęp do zapisu. Na przykład, możesz utworzyć bazę danych dla tego użytkownika, do której będą mogli pisać, a następnie dodać go do grupy z dostępem do odczytu innych baz danych zgodnie z wymaganiami.
Krok 4 — Tworzenie dokumentu produktu
Teraz utwórzmy nasz pierwszy dokument za pomocą Futon, wykonując następujące kroki:
- Otwórz
mycouchshop
baza danych. - Kliknij „Nowy dokument”.
- Kliknij „Dodaj pole”, aby rozpocząć dodawanie danych do dokumentu JSON. Zwróć uwagę, że identyfikator jest wstępnie wypełniany dla Ciebie, zdecydowanie radzę nie zmieniać tego. Dodaj klucz „name” o wartości „Nettuts CouchDB Tutorial One”.
- Upewnij się, że klikniesz znacznik obok każdego atrybutu, aby go zapisać.
- Kliknij „Zapisz dokument”.
Wejdź na wyższy poziom, z powrotem do bazy danych i powinieneś zobaczyć jeden dokument wymieniony z poprzednim identyfikatorem jako kluczem i wartością zaczynającą się od {rev:
. To jest właśnie utworzony dokument JSON.
Krok 5 – Aktualizacja dokumentu
CouchDB jest bazą danych tylko z dołączaniem — nowe aktualizacje są dołączane do bazy danych i nie zastępują starej wersji. Każda nowa aktualizacja dokumentu JSON z istniejącym identyfikatorem doda nową wersję. To właśnie oznacza automatycznie wstawiony klucz wersji. Wykonaj poniższe czynności, aby zobaczyć, jak to działa:
- Przeglądanie zawartości
mycouchshop
bazy danych, kliknij jedyny widoczny rekord. - Dodaj kolejny atrybut z kluczem „typ” i wartością „produkt”.
- Kliknij „Zapisz dokument”.
Po naciśnięciu przycisku Zapisz nowy klucz wersji powinien być widoczny, zaczynając od cyfry 2. Cofanie się o poziom do mycouchshop
widoku bazy danych, nadal będziesz widzieć tylko jeden dokument, jest to najnowsza wersja naszego dokumentu produktu.
Wersje
Podczas gdy CouchDB używa poprawek wewnętrznie, staraj się nie polegać na tym zbytnio. Wersje można dość łatwo wyczyścić za pomocą Futon i nie jest on przeznaczony do stosowania jako system kontroli wersji. CouchDB korzysta z wersji w ramach funkcji replikacji.
Krok 6 – Tworzenie dokumentu za pomocą cURL
Wspomniałem już, że CouchDB korzysta z interfejsu RESTful, a czytelnik z orzełm wzrokiem zauważyłby, że Futon używa tego za pośrednictwem konsoli w Firebugu. Jeśli tego nie zrobiłeś, udowodnijmy to, wstawiając dokument za pomocą cURL za pośrednictwem Terminala.
Pierwszy , stwórzmy dokument JSON z poniższą zawartością i zapiszmy go na pulpicie wywołując plik person.json
.
{ "forename": "Gavin", "surname": "Cooper", "type": "person" }
Dalej , otwórz terminal i wykonaj cd ~/Desktop/
umieszczając cię we właściwym katalogu, a następnie wykonaj wstawkę za pomocą curl -X POST http://127.0.0.1:5984/mycouchshop/ -d @person.json -H "Content-Type:application/json" . CouchDB powinien był zwrócić dokument JSON podobny do poniższego.
{"ok":true,"id":"c6e2f3d7f8d0c91ce7938e9c0800131c","rev":"1-abadd48a09c270047658dbc38dc8a892"}
Jest to identyfikator i numer wersji wstawionego dokumentu. CouchDB jest zgodny z konwencją RESTful, a zatem:
- PUBLIKUJ - tworzy nowy rekord
- POBIERZ - czyta zapisy
- PUT - aktualizuje rekord
- USUŃ - usuwa rekord
Krok 7 — przeglądanie wszystkich dokumentów
Możemy dodatkowo zweryfikować naszą wkładkę, przeglądając wszystkie dokumenty w naszym mycouchshop
bazy danych przez wykonanie curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs
.
Krok 8 – Tworzenie prostej funkcji mapy
Przeglądanie wszystkich dokumentów jest praktycznie bezużyteczne. Bardziej idealne byłoby przejrzenie wszystkich dokumentów produktowych. Aby to osiągnąć, wykonaj poniższe czynności:
- W Futon kliknij menu rozwijane widoku i wybierz „Widok tymczasowy”.
- To jest edytor redukcji map w Futon. Skopiuj poniższy kod do funkcji map.
function (doc) { if (doc.type === "product" && doc.name) { emit(doc.name, doc); } }
- Kliknij uruchom i powinieneś zobaczyć pojedynczy produkt, który dodaliśmy wcześniej.
- Śmiało i utrwal ten widok, zapisując go.
Po utworzeniu tej prostej funkcji mapy możemy teraz zażądać tego widoku i zobaczyć jego zawartość przez HTTP za pomocą następującego polecenia curl -X GET http://127.0.0.1:5984/mycouchshop/_design/products/_view/products .
Niewielką rzeczą do zauważenia jest to, w jaki sposób domyślnie uzyskujemy identyfikator i wersję dokumentu.
Krok 9 — Przeprowadzanie redukcji
Aby przeprowadzić użyteczną redukcję, dodajmy kolejny produkt do naszej bazy danych i dodajmy atrybut ceny o wartości 1,75 do naszego pierwszego produktu.
{ "name": "My Product", "price": 2.99, "type": "product" }
W naszym nowym widoku dodamy zarówno redukcję, jak i mapę. Najpierw musimy zdefiniować mapę jak poniżej.
function (doc) { if (doc.type === "product" && doc.price) { emit(doc.id, doc.price); } }
Powyższa funkcja mapy po prostu sprawdza, czy wprowadzony dokument jest produktem i czy ma cenę. Jeśli te warunki zostały spełnione, cena produktów jest emitowana. Funkcja zmniejszania znajduje się poniżej.
function (keys, prices) { return sum(prices); }
Powyższa funkcja pobiera ceny i zwraca sumę za pomocą jednej z wbudowanych funkcji redukcji w CouchDB. Upewnij się, że zaznaczyłeś opcję zmniejszania w prawym górnym rogu tabeli wyników, ponieważ w przeciwnym razie możesz nie być w stanie zobaczyć wyników zmniejszenia. Może być konieczne wykonanie twardego odświeżenia strony, aby wyświetlić opcję zmniejszania