Bazy Danych

Opis zajęć i zasad

Zajęcia 11

Bazy danych NoSQL *

Ściągnij kod

NetBeans Project

Jary

JSON

JSON (JavaScript Object Notation) jest prostym formatem wymiany danych.

Zapis i odczyt danych w tym formacie jest łatwy do opanowania przez ludzi gdyż JSON jest formatem tekstowym. W przypadku formatu JSON dane przybierają następujące formy:

Obiekt jest nieuporządkowanym zbiorem par nazwa/wartość. Opis obiektu rozpoczyna { (lewa klamra) a kończy } (prawa klamra). Po każdej nazwie następuje : (dwukropek) oraz pary nazwa/wartość, oddzielone , (przecinkiem).
Tabela jest uporządkowanym zbiorem wartości. Opis tabeli rozpoczyna znak [ (lewy nawias kwadratowy) a kończy znak ] (prawy nawias kwadratowy). Poszczegóne wartości rozdialane są znakiem , (przecinek).
Wartość to łańcuch znakowy, którego początek i koniec oznacza podwójny cudzysłów, lub liczba, lub wartość true (prawda) lub false (fałsz) lub null, lub obiekt lub tabela. Struktury te można zagnieżdżać.

Przykład:

{
"dane": {
"user": [ {
"imie":"Jan",
"nazwisko":"Kowalski"
},
{
"imie":"Piotr",
"nazwisko":"Nowak"
}
] }
}

Ten sam zestaw danych w postaci XML wygląda następująco:

<dane>
<user>
<imie>jan</imie>
<nazwisko>Kowalski</nazwisko>
</user>
<user>
<imie>Piotr</imie>
<nazwisko>Nowak</nazwisko>
</user>
</dane>

Mongo

Pod pojęciem bazy nierelacyjnej (NoSQL database) najczęściej rozumie się przechowywanie danych w formie listy par obiektów klucz-wartość, w których nie występują powiązania relacyjne między przechowywanymi obiektami. W bazie NoSQL najczęściej nie ma wymagania aby obiekty były jednorodne pod względem struktury. Niekiedy pojecie to używane jest szerzej, do określenia wszelkich struktur danych (niekoniecznie o postaci klucz-wartość) w których nie występują tabele i relacje. NoSQL to system baz danych nie posiadający relacji oraz zwykle nie mający zdefiniowanego języka zapytań SQL. Dane zawarte w NoSQL nie mają z góry określonej postaci (schema), jak to ma miejsce np. w bazach relacyjnych typu SQL.

Przykładem bazy NoSQL jest MongoDB.

MongoDB zapisuje dane w oparciu o kolekcje (collections), w których umieszczane są dokumenty w formacie przypominającym JSON (BSON).

MongoDB najlepiej nadaje się do pewnych zadań takich jak:

Źródło danych dla serwisu internetowego: dużych plików multimedialnych.
Potrzebujących wydajnego keszowania danych.
Przechowywanie dużych ilość mało wartościowych danych.
Wymagających wysokiej skalowalności.

Map-Reduce

MapReduce - sposób przetwarzania równoległego dużych zbiorów danych w klastrach komputerów stworzona przez firmę Google. Nazwa była zainspirowana funkcjami map i reduce z programowania funkcyjnego.

Operacje realizowane są podczas dwóch kroków:

map - węzeł nadzorczy (master node) pobiera dane z wejścia i dzieli je na mniejsze podproblemy, po czym przesyła je do węzłów roboczych (worker nodes). Każdy z węzłów roboczych może albo dokonać kolejnego podziału na podproblemy, albo przetworzyć problem i zwrócić odpowiedź do głównego programu.
reduce - główny program bierze odpowiedzi na wszystkie podproblemy i łączy je w jeden wynik - odpowiedź na główny problem.

Główną zaletą MapReduce jest umożliwienie łatwego rozproszenia operacji. Zakładając, że każda z operacji "map" jest niezależna od pozostałych, może być ona realizowana na osobnym serwerze.

Szczegóły Map-Reduce w MongoDB:

Zadanie Domowe

Zadanie:

  1. Zapoznaj się z działaniem bazy danych Mongo z przykładów dodawania elementów z pliku MongoInsert.java i wyszukiwania elementów z pliku MongoQuery.java.

  2. (MongoInsert) Dodaj do kolekcji "people" swoje dane (wg schematu):

    {
    "_id": "nr_indeksu",
    "name": "Twoje imie i nazwisko",
    "address": {
    "street": "adres",
    "city": "wydziału",
    "state": "wlkp",
    "zip": "kod_wydzialu"
    }
    }

    W razie problemów spójrz na przykład w MongoUpdate.java.

  3. (MongoUpdate) MongoUpdate nadpisuje dane w bazie danych, co zrobić żeby w podanym przykładzie zmieniał tylko wartośći adresu, a nie zmieniał całego elementu (dokumentu) na nowy? Wklej kawałek kodu jako rozwiązanie

  4. (MongoSafeImage) GridFS pozwala na zapisywanie dużych plików w MongoDB. Pliki są łączone w tzw. chunks i zapisywane w bazie, dostęp do nich następuje przez metadane.

    Zmień kod tak, by dodawał trzy różne obrazki o takiej same nazwie i pobierz za pomocą nazwy jeden z nich. Odpowiedz który został pobrany i dlaczego? Jaki kod pozwoli nam pobrać trzeci obrazek o danej nazwie?

  5. (MongoMapReduce) Zmień kod tak, aby wypisywał dla każdej litery kraj, który ma najwięcej lotnisk o kodach zaczynających się na tę literę.

    Uwaga! Funkcje Map, Reduce i Finalize muszą być zapisane w Javascripcie stąd taka dziwna forma w kodzie.
    Do testowania jak działa JS można wykorzystać stronę http://www.w3schools.com/js/tryit.asp?filename=tryjs_array
    Hint - użyj metody finalize w MapReduce w którym wyszukasz najliczniejszego elementu w tablicy. Przykładowe kody takiego wyszukiwania w Javascript ( http://stackoverflow.com/questions/1053843/get-the-element-with-the-highest-occurrence-in-an-array )

Termin wykonania zadania: Sobota 14.01.2017 do godziny 24.00.

Rozwiązania proszę przesłać przez stronę:

Logujemy się jak na komputery Wydziałowe, przesyłamy plik (jeden wspólny dla wszystkich) z rozwiązaniami.

UWAGA! Rozwiązania można przesłać tylko raz.

*

Wykorzystano materiały z

https://www.javacodegeeks.com/2015/09/mongodb-mapreduce-tutorial.html

https://www.mkyong.com/mongodb/java-mongodb-save-image-example/

http://www.json.org/json-pl.html

http://webmade.org/porady/json-js.php

http://www.mkyong.com/mongodb/java-mongodb-hello-world-example/

https://www.mongodb.com/blog/post/getting-started-with-mongodb-and-java-part-i

https://mlab.com/

http://www.mkyong.com/mongodb/java-mongodb-update-document/

http://www.python.rk.edu.pl/w/p/mongodb/

http://www.poswojsku.info/internet-it/MongoDB-nierelacyjna-baza-danych-NoSQL-poradnik-developera-bazy-danych-MongoDB.html