Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:dydaktyka:ztb:2010:projekty:nosql_mongodb:start [2010/07/02 03:41]
ztb2010
pl:dydaktyka:ztb:2010:projekty:nosql_mongodb:start [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== NoSQL ====== ====== NoSQL ======
-Ruch NoSQL promuje klasę nierelacyjnych baz jako alternatywę dla tradycyjnych baz relacyjnych,​ nazywając je czasami bazami następnej generacji. Bazy te unikają poleceń JOIN, nie posiadają sztywnych schematów oraz cechują się dobrą skalowalnością.+Ruch **NoSQL** promuje klasę nierelacyjnych baz jako alternatywę dla tradycyjnych baz relacyjnych,​ nazywając je czasami bazami następnej generacji. Bazy te unikają poleceń JOIN, nie posiadają sztywnych schematów oraz cechują się dobrą skalowalnością.
  
 Oto kilka rozwiązań zaproponowanych przez ruch NoSQL: Oto kilka rozwiązań zaproponowanych przez ruch NoSQL:
-  * Bazy zorientowane dokumentowo:​+  ​* **Bazy zorientowane dokumentowo:​**
     * MongoDB (SourceForge,​ SugarCRM, EA, The New York Times)     * MongoDB (SourceForge,​ SugarCRM, EA, The New York Times)
     * Apache CouchDB     * Apache CouchDB
-  * Bazy typu klucz/​wartość:​+  ​* **Bazy typu klucz/​wartość:​**
     * BigTable (Google App Engine)     * BigTable (Google App Engine)
     * Dynamo (Amazon Web Services)     * Dynamo (Amazon Web Services)
Linia 12: Linia 12:
     * Project Voldemort (LinkedIn)     * Project Voldemort (LinkedIn)
 ====== MongoDB ====== ====== MongoDB ======
-MongoDB to bardzo wydajna i skalowalna baza danych, zorientowana na przechowywanie dokumentów z pominięciem schematów. Projekt został wydany na licencji AGPL w wersji 3 i możemy go używać w aplikacjach biznesowych.+MongoDB to bardzo wydajna i skalowalna baza danych, zorientowana na przechowywanie dokumentów z pominięciem schematów. Projekt został wydany na licencji AGPL w wersji 3i można z niego korzystać w aplikacjach biznesowych.
  
 MongoDB jest bazą nowej generacji, która jest zorientowana na przechowywanie dokumentów JSON, o dowolnej strukturze. Dokumenty te są przechowywane wewnętrznie jako BSON – Binary JSON. Całość została napisana w języku Cpp. Bazę stworzono z myślą o pracy w dużych obciążeniach oraz posiada wbudowane mechanizmy skalowania i replikacji ​ W przypadku instalacji 32-bitowej rozmiar pojedynczej bazy danych jest ograniczony do około 2GB. MongoDB jest bazą nowej generacji, która jest zorientowana na przechowywanie dokumentów JSON, o dowolnej strukturze. Dokumenty te są przechowywane wewnętrznie jako BSON – Binary JSON. Całość została napisana w języku Cpp. Bazę stworzono z myślą o pracy w dużych obciążeniach oraz posiada wbudowane mechanizmy skalowania i replikacji ​ W przypadku instalacji 32-bitowej rozmiar pojedynczej bazy danych jest ograniczony do około 2GB.
  
-MongoDB składa się z trzech komponentów:​+**MongoDB składa się z trzech komponentów:​**
   * mongod - serwer bazodanowy   * mongod - serwer bazodanowy
   * mongos   * mongos
   * mongo - powłoka shell'​owa umożliwiająca administrację bazą danych   * mongo - powłoka shell'​owa umożliwiająca administrację bazą danych
 +
 +===== Sterowniki =====
 +
  
 Dostęp do bazy możliwy jest przy wykorzystaniu sterowników,​ które oficjalnie w tej chwili są dostępne dla języków: ​ Dostęp do bazy możliwy jest przy wykorzystaniu sterowników,​ które oficjalnie w tej chwili są dostępne dla języków: ​
Linia 51: Linia 54:
   * Smalltalk   * Smalltalk
  
-Analogie do baz SQL 
- 
-^ MongoDB ​           ^ BazaSQL ​         ^ 
-| Dokument ​         | Wiersz / Rekord ​       | 
-| Kolekcja | Tablica ​           | 
-| _id          | Klucz główny ​       | 
-| Zagnieżdżenie | Relacja 1:N            | 
-| Tablica referencji do obiektów | Relacja M:N            | 
-| Indeks | Indeks ​         | 
  
 ===== Baza dokumentowa ===== ===== Baza dokumentowa =====
-W bazach zorientowanych na dokumenty, dane nie są przechowywane w tabelach o z góry założonej strukturze i takich samych polach dla każdego rekordu. Każdy dokument może mieć różne pola, a dane w każdym polu mogą być zbiorem innych danych. Puste pola nie są w dokumencie w ogóle przechowywane,​ dzięki czemu ich nagłówki nie marnują miejsca w bazie.+W bazach zorientowanych na **dokumenty**, dane nie są przechowywane w tabelach o z góry założonej strukturze i takich samych polach dla każdego rekordu. Każdy dokument może mieć różne pola, a dane w każdym polu mogą być zbiorem innych danych. Puste pola nie są w dokumencie w ogóle przechowywane,​ dzięki czemu ich nagłówki nie marnują miejsca w bazie.
  
-Przykład:+**Przykład:**
 <​code=javascript>​ <​code=javascript>​
 FirstName="​Bob",​ Address="​5 Oak St.", Hobby="​sailing"​ FirstName="​Bob",​ Address="​5 Oak St.", Hobby="​sailing"​
Linia 116: Linia 110:
   - Uruchomienie i połączenie z serwerem.   - Uruchomienie i połączenie z serwerem.
    
-Podczas pierwszego uruchomienia korzystamy z plików: mongod.exe oraz mongo.exe, które znajdują się w folderze bin w miejscu gdzie wypakowaliśmy binarną wersję MongoDB. +Podczas pierwszego uruchomienia korzystamy z plików: ​//mongod.exe// oraz //mongo.exe//, które znajdują się w folderze ​**bin** w miejscu gdzie wypakowaliśmy binarną wersję MongoDB. 
-Najpierw uruchamiamy plik mongod.exe, czyli serwer bazodanowy, a następnie mongo.exe czyli powłokę administracyjną.+Najpierw uruchamiamy plik mongod.exe, czyli serwer bazodanowy, a następnie ​//mongo.exe// czyli powłokę administracyjną.
  
 {{:​pl:​dydaktyka:​ztb:​2010:​projekty:​nosql_mongodb:​1.png|}} {{:​pl:​dydaktyka:​ztb:​2010:​projekty:​nosql_mongodb:​1.png|}}
Linia 131: Linia 125:
  
 Przykład uruchomienia pary master i slave lokalnie: Przykład uruchomienia pary master i slave lokalnie:
-  * tworzymy katalogi w miejscu gdzie znajduje się plik mongod.exe : +  * tworzymy katalogi w miejscu gdzie znajduje się plik //mongod.exe// 
-    * dbs/slave +    ​* **dbs/slave** 
-    * dbs/master+    ​* **dbs/master**
   * uruchamiamy plik mongod.exe dwukrotnie z parametrami:​   * uruchamiamy plik mongod.exe dwukrotnie z parametrami:​
     * --master --port 10000 --dbpath dbs/master     * --master --port 10000 --dbpath dbs/master
     * --slave --port 10001 --dbpath dbs/slave –source localhost:​10000     * --slave --port 10001 --dbpath dbs/slave –source localhost:​10000
  
-nazwy katalogów możemy oczywiście podać dowolne pod warunkiem, że ustawimy odpowiednie ścieżki jako parametry przy wywołaniu pliku mongod.exe.+nazwy katalogów możemy oczywiście podać dowolne pod warunkiem, że ustawimy odpowiednie ścieżki jako parametry przy wywołaniu pliku //mongod.exe//.
  
 {{:​pl:​dydaktyka:​ztb:​2010:​projekty:​nosql_mongodb:​2.png|}} {{:​pl:​dydaktyka:​ztb:​2010:​projekty:​nosql_mongodb:​2.png|}}
Linia 152: Linia 146:
  
 ===== Podstawy korzystania z shella mongo ===== ===== Podstawy korzystania z shella mongo =====
-uruchamiamy ​powłokę shellową ​tak jak to zrobiliśmy w punkcie numer 5. Domyślnie zostaniemy połączeni z bazą „test” na hoście lokalnym.+Uruchamiamy ​powłokę shellową. Domyślnie zostaniemy połączeni z bazą „**test**” na hoście lokalnym.
  
 {{:​pl:​dydaktyka:​ztb:​2010:​projekty:​nosql_mongodb:​3.png|}} {{:​pl:​dydaktyka:​ztb:​2010:​projekty:​nosql_mongodb:​3.png|}}
  
-„connecting to:” wskazuje nam nazwę bazy z której korzysta shell. Aby zmienić bazę danych wpisujemy np.:+//„connecting to:”// wskazuje nam nazwę bazy z której korzysta shell. Aby zmienić bazę danych wpisujemy np.:
 <​code=javascript>​ <​code=javascript>​
 > use mydb > use mydb
Linia 162: Linia 156:
 </​code>​ </​code>​
  
-wpisując powyższe polecenie przeszliśmy z bazy o nazwie „test” do bazy „mydb”.+wpisując powyższe polecenie przeszliśmy z bazy o nazwie „//test//” do bazy „//mydb//”.
  
 Przyglądając się następnym przykładom,​ warto zwrócić uwagę, że nigdy ręcznie nie tworzymy bazy danych lub kolekcji. MongoDB zajmie się tym za nas, zaraz po tym jak wydamy polecenie wstawienia danych do bazy. MongoDB stworzy bazę jeśli do tej pory taka nie istnieje i uzupełni ją danymi. Jeśli chcemy pobrać coś z kolekcji, która nie istnieje, MongoDB traktuje to jako pustą kolekcję. ​ Przyglądając się następnym przykładom,​ warto zwrócić uwagę, że nigdy ręcznie nie tworzymy bazy danych lub kolekcji. MongoDB zajmie się tym za nas, zaraz po tym jak wydamy polecenie wstawienia danych do bazy. MongoDB stworzy bazę jeśli do tej pory taka nie istnieje i uzupełni ją danymi. Jeśli chcemy pobrać coś z kolekcji, która nie istnieje, MongoDB traktuje to jako pustą kolekcję. ​
  
-Jeśli zmieniamy bazę danych korzystając z komendy use, to baza nie zostanie utworzona od razu, lecz przy pierwszym wstawieniu do niej informacji. ​+Jeśli zmieniamy bazę danych korzystając z komendy ​**use**, to baza nie zostanie utworzona od razu, lecz przy pierwszym wstawieniu do niej informacji. ​
  
 Aby wyświetlić już  istniejące bazy danych korzystamy z polecenia: Aby wyświetlić już  istniejące bazy danych korzystamy z polecenia:
Linia 176: Linia 170:
  
 ==== Wstawiane danych do kolekcji ==== ==== Wstawiane danych do kolekcji ====
-Stworzymy teraz dwa obiekty: ​ j oraz t, a następnie zapiszemy je w kolekcji things.+Stworzymy teraz dwa obiekty:  ​**j** oraz **t**, a następnie zapiszemy je w kolekcji ​//things//.
  
 Utworzenie obiektu j: Utworzenie obiektu j:
Linia 218: Linia 212:
 </​code>​ </​code>​
  
-Napisem has more shell informuje nas o tym, że nie wszystkie dane zostały wyświetlone, aby przejrzeć kolejną część, musimy wpisać polecenie:+Napisem ​//has more//, shell informuje nas o tym, że nie wszystkie dane zostały wyświetlone. Aby przejrzeć kolejną część, musimy wpisać polecenie:
 <​code=javascript>​ <​code=javascript>​
 > it > it
Linia 248: Linia 242:
 „where a=A and b=B and ...” „where a=A and b=B and ...”
  
-Pole _id jest generowane automatycznie i zwracane po każdym wykonaniu zapytania.+Pole **_id** jest generowane automatycznie i zwracane po każdym wykonaniu zapytania.
  
 === Funkcja findOne() === === Funkcja findOne() ===
  
-Funkcja findOne() przyjmuje te same parametry co funkcja find(), ale zwraca albo tylko pierwszy dokument zwrócony z bazy danych, albo null jeśli żaden dokument nie odpowiada zapytaniu. ​+Funkcja ​**findOne()** przyjmuje te same parametry co funkcja ​**find()**, ale zwraca albo tylko pierwszy dokument zwrócony z bazy danych, albo null jeśli żaden dokument nie odpowiada zapytaniu. ​
  
 Przykład: Przykład:
Linia 266: Linia 260:
  
 === Funkcja limit() === === Funkcja limit() ===
-Funkcja limit() pozwala ograniczyć nam ilość zwróconych wyników. Jest szczególnie polecana, ze względów wydajnościowych. Pozwala ograniczyć pracę bazy danych i ogranicza liczbę danych przesyłanych przez sieć.+Funkcja ​**limit()** pozwala ograniczyć nam ilość zwróconych wyników. Jest szczególnie polecana, ze względów wydajnościowych. Pozwala ograniczyć pracę bazy danych i ogranicza liczbę danych przesyłanych przez sieć.
  
 Oto przykład: Oto przykład:
Linia 319: Linia 313:
 ==== Ciekawe funkcje pomocy ==== ==== Ciekawe funkcje pomocy ====
  
 +Jeżeli jesteśmy ciekawi co robi dana funkcja shellowa wystarczy, że wpiszemy jej nazwę w powłoce i zostanie wyświetlone jej źródło:
 +
 +<​code=javascript>​
 +> printjson
 +function (x) {
 +    print(tojson(x));​
 +}
 +</​code>​
 +
 +
 +Mongo jest powłoką w pełni JavaScriptową,​ więc dowolna funkcja JavaScriptowa,​ składnia lub klasa może zostać użyta w powłoce.
 +
 +Przykład:
 +<​code=javascript>​
 +> db.eval(function(name) { return "​Hello,​ "​+name;​ }, ["​Joe"​])
 +Hello, Joe
 +</​code>​
 +
 +====== PHP i MongoDB ======
 +===== Konfiguracja środowiska =====
 +  - Pobieramy i instalujemy wybraną wersję php
 +  - Ze strony [[http://​github.com/​mongodb/​mongo-php-driver/​downloads|http://​github.com/​mongodb/​mongo-php-driver/​downloads]] pobieramy odpowiedni sterownik dla naszej wersji php: 
 +    * VC6 jest dla Apache a VC9 dla IIS.
 +    * Thread safe jest dla typowej instalacji php (moduł Apache), non-thread dla CGI.
 +  - Pobrany plik rozpakowujemy i znajdujący się w nim plik o nazwie: //​php_mongo.dll//​ kopiujemy do folderu **ext** znajdującego się w folderze domowym instalacji php
 +  - Otwieramy plik //php.ini// i dopisujemy linijkę:<​code>​
 +extension=php_mongo.dll
 +</​code>​
 +  - Uruchamiamy serwer php.
 +  - Uruchamiamy serwer mongod
 +
 +===== Podstawy współpracy PHP z MongoDB ​ =====
 +
 +Połączenie z bazą danych nawiązujemy tworząc nowy obiekt Mongo:
 +<​code=php>​
 +$mongo = new Mongo();
 +</​code>​
 +
 +Opcjonalnie w parametrach konstruktora możemy zdefiniować gdzie znajduje się nasza baza danych. Jeżeli nie podamy nic, wartością domyślną będzie //​localhost:​27017//​ czyli standardowa instalacja MongoDB.
 +
 +W kolejnym kroku wybieramy bazę danych z którą będziemy współpracować:​
 +<​code=php>​
 +
 +</​code>​
 +<​code=php>​
 +//test jest nazwą bazy danych
 +$db = $mongo->​test;​
 +</​code>​
 +
 +W wypadku, gdy baza o podanej nazwie nie istnieje to zostanie utworzona nowa. Tak samo dzieje się w przypadku kolekcji.
 +<​code=php>​
 +//foo jest nazwą kolekcji
 +$collection = $db->​foo;​
 +</​code>​
 +
 +Dodanie przykładowych danych wygląda następująco:​
 +<​code=php>​
 +$doc = array( "​name"​ => "Lorem Ipsum",​
 +    "​type"​ => "​whatever",​
 +    "​count"​ => 1,
 +    "​info"​ => (object)array( "​x"​ => 203,
 +        "​y"​ => 102),
 +    "​versions"​ => array("​0.9.7",​ "​0.9.8",​ "​0.9.9"​)
 +);
 +
 +$collection->​insert($doc);​
 +</​code>​
 +
 +Jak widać operacja ta jest bardzo prosta. Warto zaznaczyć, że nie ma znaczenia jakie pola umieścimy w każdym z dokumentów,​ ponieważ nawet w obrębie jednej kolekcji mogą być one całkowicie różne.
 +
 +Możemy też skorzystać z metody **batchInsert(array $documents)** która jednorazowo doda kilka dokumentów.
 +
 +Pobieranie danych możemy zrealizować następująco:​
 +<​code=php>​
 +// wszystkie dokumenty
 +$rangeQuery = array();
 +
 +// i równe 71
 +$rangeQuery = array( "​i"​ => 71 );
 +
 +// dokumenty, gdzie 5 < x < 20
 +$rangeQuery = array('​x'​ => array( '​$gt'​ => 5, '​$lt'​ => 20 ));
 +
 +$cursor = $collection->​find($rangeQuery);​
 +</​code>​
 +
 +Zwrócone dane są obiektem klasy MongoCursor i zachowują się jak najzwyklejszy iterator:
 +<​code=php>​
 +foreach ($cursor as $document) {
 +    print_r($document);​
 +}
 +</​code>​
 +
 +Usuwanie danych wygląda tak:
 +<​code=php>​
 +$collection->​remove($criteria);​
 +</​code>​
 +gdzie $criteria to tablica w identycznym formacie jak podczas wyszukiwania danych.
 +
 +Uaktualnianie danych
 +<​code=php>​
 +$collection->​update($criteria,​ $newDoc);
 +</​code>​
 +gdzie $criteria to tablica w identycznym formacie jak podczas wyszukiwania danych, a $newDoc to dane które mają zastąpić stary dokument.
 +
 +Indeksy odczuwalnie przyspieszają wyszukiwanie,​ nieznacznie zwalniają dodawanie i aktualizacje. Są obecne w relacyjnych bazach i są obecne także w MongoDB.
 +
 +Do dodania indeksu służy metoda **ensureIndex()** klasy //​MongoCollection//​. ​
 +
 +Przykład:
 +<​code=php>​
 +// create an index on '​x'​ ascending
 +$c->​ensureIndex(array('​x'​ => 1));
 +
 +// create an index on '​z'​ ascending and '​zz'​ descending
 +$c->​ensureIndex(array('​z'​ => 1, '​zz'​ => -1));
 +
 +// create a unique index on '​x'​
 +$c->​ensureIndex(array('​x'​ => 1), array("​unique"​ => true));
 +</​code>​
 +
 +===== Prosty przykład aplikacji =====
 +Poniżej przedstawiony został kod okazujący działanie php z MongoDB:
 +
 +<​code=php>​
 +//tworzymy obiekt klasy Mongo
 +$mongo = new Mongo();
 +
 +//​wskazujemy bazę danych, na której chcemy operować
 +$db = $mongo->​test;​
 +
 +//​wskazujemy kolekcję
 +$collection = $db->​foo;​
 +
 +//​przygotowujemy dane do wstawienia
 +$doc = array( "​name"​ => "Lorem Ipsum",​
 +    "​type"​ => "​whatever",​
 +    "​count"​ => 1,
 +    "​info"​ => (object)array( "​x"​ => 203,
 +        "​y"​ => 102),
 +    "​versions"​ => array("​0.9.7",​ "​0.9.8",​ "​0.9.9"​)
 +);
 +
 +//wstawiamy dane do kolekcji
 +$collection->​insert($doc);​
 +
 +//pobieramy wszystkie dane z kolekcji
 +$rangeQuery = array();
 +$cursor = $collection->​find($rangeQuery);​
 +
 +//iterujemy po zwróconych wynikach i wypisujemy je
 +foreach ($cursor as $document) {
 +    print_r($document);​
 +}
 +
 +//usówamy wstawione dane
 +$collection->​remove($doc);​
 +</​code>​
 +
 +Plik z kodem do ściągnięcia:​ {{:​pl:​dydaktyka:​ztb:​2010:​projekty:​nosql_mongodb:​index.rar|tutaj}}
 +
 +====== Podsumowanie ======
 +
 +Projekt MongoDB zyskał na popularności po kilku udanych wdrożeniach. Portal [[http://​www.veoh.com/​|Veoh]] wykorzystuje MongoDb do przechowywania około 100MB plików wideo, a ServerDensity przeszedł z MySQL na rzecz MongoDB w swojej flagowej aplikacji do monitoringu serwerów.
 +
 +MongoDB z jednej strony trzyma dane jak CauchDB, czyli w postaci hierarchicznych dokumentów,​ korzystając przy tym z JSONowej składni. Z drugiej strony posiada funkcję find(), która może przyjąć wyrażenie regularne, jako parametr do odfiltrowania danych. Baza posiada również indeksy. Czyli jednym zdaniem: obiektowo, hierarchicznie,​ JSONowo, nie SQLowo ale z możliwością robienia zapytań. ​
 +
 +Analogie do baz SQL:
 +
 +^ MongoDB ​           ^ Baza SQL          ^
 +| Dokument ​         | Wiersz / Rekord ​       |
 +| Kolekcja | Tablica ​           |
 +| _id          | Klucz główny ​       |
 +| Zagnieżdżenie | Relacja 1:N            |
 +| Tablica referencji do obiektów | Relacja M:N            |
 +| Indeks | Indeks ​         |
  
  
 +Zastosowania:​
 +  * Tak:
 +    * Źródło danych dla serwisu internetowego:​ MongoDB bardzo szybko operuje na danych, świetnie się skaluje oraz posiada mechanizmy replikacji, które są wymagane dla dużych serwisów internetowych.
 +    * Cache'​owanie:​ wydajność Mongo można wykorzystać jako cache danych w np. infrastrukturze intranetowej. Dzięki trwałemu keszowaniu po restarcie systemu, czy bazy sieć nie zostanie przeciążona generowaniem cache'​a.
 +    * Duża ilość mało wartościowych danych: w przypadku napływu bardzo dużej ilości "mało ważnych"​ danych (np. logi) przetrzymywanie ich w tradycyjnej bazie staje się nieefektywne i zazwyczaj trzeba obsługiwać to na poziomie plików. MongoDB można wykorzystać w prosty sposób jako magazyn tego typu danych. ​
 +    * Problemy wymagające wysokiej skalowalności,​ wydajności i rozszerzalności:​ MongoDB dobrze czuje się w wieloserwerowych konfiguracjach. Zaimplementowano również silnik map/reduce.
 +    * rozwiązania GIS
 +  * Nie:
 +    * Wszędzie tam gdzie wymagana jest wysoka transakcyjność
 +    * Przy problemach wymagających języka SQL
  
 +====== Bibliografia ======
 +  * [[http://​www.mongodb.org/​]]
 +  * [[http://​www.python.rk.edu.pl/​w/​p/​zarzadzanie-danymi-w-bazie-mongodb/​]]
 +  * [[http://​www.php.net/​manual/​en/​mongo.manual.php]]
 +  * [[http://​phpgeek.pl/​152/​mongodb-ruch-nosql-przyszloscia-baz-danych/​]]
 +  * [[http://​rails.gen2.org/​2009/​11/​30/​mongo-db/​]]
 +  * [[http://​en.wikipedia.org/​wiki/​MongoDB]]
 +  * [[http://​pl.wikipedia.org/​wiki/​JSON]]
 +  * [[http://​webmade.org/​porady/​json-js.php]]
pl/dydaktyka/ztb/2010/projekty/nosql_mongodb/start.1278034911.txt.gz · ostatnio zmienione: 2019/06/27 15:56 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0