BAD10.rs

Bazy Danych

Opis zajęć i zasad

Zajęcia 10

Indeksy i ORM *

Ściągnij kod

Java Project

Indeksy

Indeks jest specjalną strukturą danych wprowadzoną w celu zwiększenia prędkości wykonywania operacji na tabeli. Indeks w bazie danych jest odpowiednikiem spisu treści w książce.

Indeksy tworzymy poprze komendę CREATE

CREATE INDEX nazwa
ON Tabela (kolumny)

Podczas realizowania zapytania optymalizator (SQL Server) najpierw przeszukuje indeks, który jest uporządkowany, a następnie na podstawie indeksu odczytuje odpowiednie rekordy.

Indeksy dzielimy na główne (dla kluczy głównych), zgrupowane (dla nieunikalnych wartości grupujące te same wartości), niezgrupowany (podobnie jak zgrupowany tylko pamięta wszystkich pozycji elementów, jest gęstszy). Niezależnie od tego, czy indeksy są zgrupowane, czy niezgrupowane, najczęściej tworzone są w formie drzew zbalansowanych. Gwarantuje to logarytmiczny (względem rozmiaru) czas wykonywania podstawowych operacji takich jak wstawianie, wyszukiwanie czy usuwanie elementów.

W praktyce indeksy tworzymy dla:

Kolumn z ograniczeniem PRIMARY KEY.

Kolumn z ograniczeniem FOREIGN KEY oraz kolumn wykorzystywanych przy łączeniu tabel.

Kolumn przechowujących dane wykorzystywane jako argument wyszukiwania.

Kolumn przechowujących często sortowane dane.

JDBC

Java DataBase Connectivity - łącze do baz danych w języku Java. Aby móc posługiwać się bazą SQLite w Javie potrzebujesz tak naprawdę tylko jednej rzeczy - biblioteki ze sterownikiem konkretnej bazy danych. Dla MSSQL jest to JTDC lub Microsoft JDBC.

JTDS korzysta z autoryzacji serwera SQL server przez credentials konta windows.

Aby połączyć się z bazą danych inicjalizujemy sterownik "net.sourceforge.jtds.jdbc.Driver" oraz ustanawiamy połączenie z bazą danych za pomocą klasy DriverManager podając parametry. Następnie inicjalizujemy obiekt "statement" wykonujący wyrażenia sql za pomocą metody executeStatement(query) lub executeQuery(query) (w zależności od wykonywanego zapytania). Na końcu musimy pamiętać o zamknięciu elementów połączenia z bazą.

ORM

Object-Relational Mapping ORM – sposób odwzorowania obiektowej architektury systemu informatycznego na bazę danych (lub inny element systemu) o relacyjnym charakterze. Implementacja takiego odwzorowania stosowana jest m.in. w przypadku, gdy tworzony system oparty jest na podejściu obiektowym, a system bazy danych operuje na relacjach. Ułatwia to programistom pracę z bazą danych, często odbywa się to jednak kosztem wydajności zapytań do bazy danych. Największą zaletą ORM jest prostota użytkowania.

Przykładowo, aby zmienić hasło użytkownika w bazie danych użytkowników musimy wykonać poniższą operację:

public void changePassword(User u, String newPassword) {
        con.prepareStatement(UPDATE tab_users SET password = ? WHERE login = ?).
        setString(1, u.getPassword()).
        setString(2, u.getLogin()).execute();
}

Chcielibyśmy, aby taka operacja wyglądała następująco:

public void changePassword(User u, String newPassword) {
      u.setPassword(newPassword);
}

a więc bez konieczności „grzebania” w relacyjnej bazie danych.

Najbardziej popularną implementacją idei ORM dla javy jest Hibernate.

Elementy technologii ORM :
API (Application Programming Interface), czyli Interfejs programowania aplikacji) do zarządzania trwałością obiektów

Mechanizm specyfikowania metadanych opisujących odwzorowanie klas na relacje w bazach danych

Język lub API do wykonywania zapytań.

Praca z ORM:

Tworzymy model danych w obiektowym języku programowania.

Tworzymy schemat bazy danych odpowiadający temu modelowi (może się oczywiście okazać, że już mamy jakąś bazę danych, z którą musimy współpracować).

Definiujemy odwzorowanie bazy danych na model relacyjny. Tworzymy aplikację obiektową operującą na modelu obiektowym (tworząc kod aplikacji w zasadzie nie musimy się zastanawiać jak nasze obiekty zostaną zapisane).

W razie konieczności pobrania obiektów z bazy danych, bądź utrwalenia jakiegoś nowo utworzonego obiektu, czy też usunięcia utrwalonego obiektu posługujemy się odpowiednim API danego narzędzia ORM.

Zadania

W bazie DBADLI0_1CD na serwerze mssql.wmi.amu.edu.pl mamy poniższy schemat bazy danych:

Baza

Ściągnij i wypakuj kod

Java Project

Wejdź do środowiska programistycznego np IntelliJ i wczytaj ściągnięty kod

File -> New -> Project From Existing Source

Znajdź wypakowany katalog, wybierz

Create Project from existing source -> Next do koñca. Na koniec wybierz w wyskakującym oknie Open in this Window.

W katalogu src znajduje się kod aplikacji.

Otwórz Pakiet Basic Example -> SqlConnection
Wejdź w Run -> Run... -> Edit Configurations i dodaj w parametrach VM linijkę -Djava.library.path = scieżka_do_katalogu_projektu/Biblio

Musisz to zrobić gdyż program musi wczytać bibliotekę nylmauth.dll by móc korzystać z tzw. Windows Authentication, na wydziałowym serwerze mssql.wmi.amu.edu.pl.

Uruchom plik SqlConnection, spójrz jak wygląda kod aplikacji.
Przejdź do PrepareStatement
Uruchom klasę Window

Wykonaj zapytania z pliku Zapytania.txt w wersji statement i prepareStatement.

Przejdź do pakietu Indeks

Wykonaj zapytania z pliku Zapytania.txt i sprawdź czasy wykonywania tych zapytań. Zaproponuj indeks bazy danych, który poprawi wyszukiwanie.

Przejdź do pakietu ORM

Zobacz jak wygląda kod w przypadku stosowania ORM-a. Dla chętnych wykonaj zadanie z pliku Zadanie.txt.

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.

Zadania

Ściągnij, wypakuj i wczytaj kod

Java Mongo Project

Zadanie:

  • Zapoznaj się z działaniem bazy danych Mongo z przykładów dodawania elementów do bazy na 4 sposoby w pliku MongoInsert.java i wyszukiwania elementów w pliku MongoQuery.java.

  • (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.

*

Wykorzystano materiały z

https://msdn.microsoft.com/pl-pl/library/baza-danych-sql-server--indeksy--kiedy-i-jak-je-stosowac.aspx

https://msdn.microsoft.com/pl-pl/library/encyklopedia-sql--indeksowanie-tabel-indeks-klastrowy-i-nieklastrowy.aspx

https://blog.exaco.pl/indeksy-mssql-server/

http://www.sqlinsider.pl/2008/09/optymalizacja-cz1-indeksy.html

http://math.uni.lodz.pl/~kowalcr/Bazy/Temat8.pdf

http://zeszyty-naukowe.wwsi.edu.pl/zeszyty/zeszyt4/Mapowanie_Obiektowo-Relacyjne_ORM_-_Czy_Tylko_Dobra_Idea.pdf

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