środa, 8 kwietnia 2015

T: Bazy danych

1.Bazy danych
 

Bazy danych to dziedzina informatyki, dynamicznie się rozwijająca i mająca szerokie zastosowanie w wielu miejscach wszędzie tam, gdzie niezbędne jest przetwarzanie jakichkolwiek danych. Rzadko spotykanym bowiem zjawiskiem jest aplikacja, która nie operuje na żadnych danych, a bazy niezwykle ułatwiają pracę z nimi. Zwykły użytkownik komputera, a nawet osoba, która z niego nie korzysta, spotyka się z bazami danych na każdym kroku. Czytelnik korzysta właśnie z serwisu, który nie istniałby bez bazy danych. Kupno biletu kolejowego, robienie zakupów czy nawet zwykłe wykonanie połączenia telefonicznego to czynności, które zazwyczaj nie kojarzą się z informatyką i z jej omawianym działem, a jednak korzystają z jego wytworów i mają z nim bardzo wiele wspólnego. Można zaryzykować stwierdzenie, że wiele innych dziedzin zarówno informatyki, jak i życia nie rozwijałoby się lub ich rozwój byłby ograniczony, gdyby nie istniały bazy danych. Problem przetwarzania informacji przez aplikacje istniał od początku istnienia programowania, a upływ czasu spowodował powstanie baz danych oraz systemów zarządzania bazami danych (silnikami baz danych). Jakiekolwiek operowanie na większych ilościach informacji implikuje bowiem rozwój tego działu informatyki.Zwroty "operowanie na danych", "większe ilości informacji" jest oczywiście nieprecyzyjny, a np. "silnik bazy danych" może być kompletnie niezrozumiały. Warto byłoby z początku sprecyzować zatem, co one (oraz inne im podobne) oznaczają, a w późniejszym czasie sformalizować w pewien sposób obszar, w jakim się poruszamy.
2.Informacje o bazach danych oraz o Systemach Zarządzania bazami danych
Na początek warto zdefiniować samo pojęcie "baza danych". Termin ten zależnie od kontekstu znaczy bowiem coś innego. Często mówi się bowiem: „używam bazy danych”, „baza danych PostgreSQL pozwala na...”, „schemat bazy danych”, „nazwa bazy danych potrzebna do zalogowania”, „parametry połączenia z bazą” itp., a w każdym z wymienionych zwrotów mamy na myśli coś innego. Najogólniej rzecz biorąc, „baza danych” to zbiór informacji wraz z możliwością łatwego dostępu oraz ich zmiany (tj. modyfikacją, dodawaniem nowych i usuwaniem starych) z poziomu aplikacji z niej korzystającej. W taki właśnie sposób rozumiane jest to określenie w pierwszym z wymienionych zwrotów. „Używam bazy danych” oznacza „korzystam ze zbioru informacji, który łatwo odczytywać i zmieniać”.Patrząc na temat pod tym kątem, można powiedzieć, że np. plik tekstowy można uznać za bazę danych jeśli odczytanie i modyfikację zapisanych w nim informacji w konkretnym zastosowaniu uznamy za łatwe (i symetrycznie – jeśli nie uznamy tego za łatwe nie można będzie pliku nazwać „bazą danych”). Przykładowo niech program wyświetla krótki komunikat, który powinien mieć możliwość dowolnej zmiany. Zastosowanie wtedy zwykłego pliku z tekstem jest jak najbardziej dobrym rozwiązaniem i można go nazwać „bazą danych”. Na rysunkach poniżej przedstawiono schematycznie sposoby, w jaki aplikacja może korzystać z danych. I tak rysunek 1 przedstawia najprostszą sytuację, kiedy dane, z jakich program korzysta, są wbudowane do niego na stałe.

Rys. 1 – Schemat programu z danymi wbudowanymi

Trudno w takim przypadku mówić o bazie danych, gdyż zazwyczaj nie istnieje możliwość zmiany zawartych w programie informacji, a na pewno jest to utrudnione. Rysunek 2 przedstawia sytuację pasującą do przykładu z zewnętrznym plikiem tekstowym.

Rys. 2 – Schemat programu korzystającego z bazy danych

 Zbiór na dysku zawiera potrzebne informacje i jest wydzielony od samej aplikacji. Pozwala to na łatwą ich modyfikację oraz odczyt. Jak widać, elipsa reprezentująca program i bazę danych nachodzą na siebie. Symbolizuje to fakt, iż program musi znać strukturę pliku podczas odczytu informacji z bazy oraz bezpośrednio w nią ingerować w trakcie ich modyfikacji. Struktura pliku jest tutaj rozumiana jako sposób przechowywania danych, która może być bardziej złożona niż ta wspomniana wyżej. Przykładowo jeśli aplikacja wyświetla kilka tekstów, niezbędnym staje się rozdzielenie ich jakoś w pliku, tak aby program był w stanie przeczytać bądź modyfikować konkretny z nich. Trzeba zatem wymyślić sposób, w jaki dane przechowywane są w bazie. Można by założyć zatem, iż jedna linijka w pliku tekstowym to jeden komunikat i skutecznie rozwiąże to przedstawiony problem. Spowoduje to jednak pojawienie się też trudności, jeśli okaże się, że wyświetlane komunikaty będą mogły zawierać znaki nowej linii. Program musi rozróżnić taki znak w środku tekstów od tego, który je rozdziela w samym pliku. Ponadto np. w nowszej wersji aplikacji może pojawić się potrzeba przechowywania poza samym tekstem komunikatu także innych informacji go dotyczących, np. jego rodzaj (informacja, ostrzeżenie, pytanie) oraz nazwę obrazka wyświetlanego obok. Spowoduje to konieczność zmiany struktury pliku i np. ustaleniu, iż każda linijka zawiera informacje o jednym komunikacie rozdzielone specjalnym znakiem przy czym znak enter oraz znak rozdzielający w samych danych nie mogą się pojawiać, aby nie spowodować problemów z ich interpretacją. W każdym razie wymusi to zmianę sposobu przechowywania danych, a to pociągnie za sobą konieczność zmiany już napisanego kodu korzystającego z niego. Skomplikujmy jeszcze nieco nasz przykład i załóżmy że, komunikatów jest bardzo dużo, a my chcemy wyświetlić wszystkie których rodzaj obrazka mówi, iż jest to ważny komunikat ostrzegawczy. Przeszukiwanie wtedy pliku i sprawdzanie każdej linijki może okazać się za wolne. Sprytny programista mógłby pogrupować wyświetlane teksty na podstawie rodzaju i utworzyć dla każdej grupy oddzielny plik w specjalnym katalogu, ale to z kolei pociągnie kolejne zmiany już napisanego kodu. Co będzie jednak, jeśli chcielibyśmy także przyspieszyć odczytywanie komunikatów wyświetlanych obok konkretnego obrazka znając jego nazwę? A jeśli aplikacji ma umożliwić wymianę bardziej złożonych informacji (np. finansowych) pomiędzy osobami znajdującymi się w różnych częściach świata? Sam plik na dysku twardym komputera wtedy nie wystarczy. W takim przypadku można by umieścić go na komputerze z dostępem do Internetu i korzystając z np. serwera FTP, czytać i zapisywać go (rysunek 3). Rozwiąże to drugi problem, jednak zwiększy pierwszy. Przeszukiwanie danych będzie wymagało każdorazowego przesłania zawartości pliku przez łącze sieciowe, co drastycznie zmniejszy wydajność.

Rys. 3 – Baza danych w postaci pliku z danymi na serwerze FTP



Proszę zwrócić uwagę, że sam plik nie jest już nazywany „bazą danych”, gdyż umieszczony na serwerze sam nie pozwala na dostęp do zawartych w nich danych ani na ich modyfikację. Dopiero dane wraz z serwerem FTP tworzą twór zdefiniowany wcześniej jako baza danych. Przedstawione rozwiązanie jest zadowalające jedynie w marginalnej części przypadków, bo (pomijając mało wydajne przeszukiwanie), co się stanie, jeśli więcej niż jedna kopia programu jednocześnie będą chciały zapisać dane do tego pliku (rysunek 4)?

Rys. 4 – Wiele programów próbuje uzyskać dostęp do tego samego pliku



Czy „wejdą sobie w drogę”? Czy trzeba samodzielnie opracować jakiś mechanizm blokady? Program nie ma jednak łatwej możliwości sprawdzenia, czy dany plik z serwera FTP próbuje odczytać inna aplikacja próbująca korzystać z tych samych danych. „Wie” to serwer, ale nie udostępnia tej wiedzy. Problem komplikuje się jeszcze bardziej, jeśli dołożymy do programu możliwość zmiany nie tylko samych danych, ale także ich rodzaju i dodawaniu nowych typów przechowywanych informacji. Oczywiście można dodać do aplikacji kod, który na podstawie np. innych plików opisujących dane będzie „rozpoznawać”, jakie informacje są zapisane, i na tej podstawie dopiero będzie je same odczytywał (informacje opisujące inne informacje nazywane są „metadanymi”). Staje się to jednak niezwykle skomplikowane. Jak widać zatem, im bardziej wymagający jest program, tym bardziej złożona staje się obsługa danych i więcej pracy wymaga jego stworzenie, zarówno jeśli chodzi o stopień skomplikowania sposobu, w jaki trzymane są dane, jak i mechanizmy blokujące część informacji na czas ich modyfikacji oraz pozwalające na jednoczesny dostęp do nich wielu użytkownikom. Pisanie za każdym razem tak dużej części kodu byłoby nieefektywne i bardzo wydłużałoby proces tworzenia oprogramowania. Właśnie to ostatnie jest jednym z głównych powodów, dla których pomiędzy bazą danych (rozumianą jako zbiór informacji z określonym sposobem jego przechowywania) a programem wprowadza się dodatkowe „coś”, co rozwiązuje przestawione problemy. Tym czymś jest system zarządzania bazą danych, w skrócie SZBD (rysunek 5)

Rys. 5 – Program korzystający z danych umieszczonych w bazie zarządzanej przez silnik bazy danych

 Często dla uproszczenia także nazywany bazą danych, tak jak miało to miejsce w zwrocie „baza danych PostgreSQL pozwala na...”, gdzie mowa o konkretnym takim systemie. Równie często spotyka się określenie „silnik bazy danych”. System zarządzania bazą danych przejmuje na siebie wiele obowiązków związanych z „technicznymi” aspektami przechowywania danych między innymi to, w jaki sposób są one trzymane na dysku. Dzięki temu, iż większość obecnie stosowanych silników bazy danych może działać jako oprogramowanie serwera możliwym staje się udostępnienie bazy dla komputerów na całym świecie. SZBD przejmuje na siebie także odpowiedzialność za blokowanie informacji na czas ich modyfikacji, by uniknąć konfliktów oraz pozwala dokonać wyszukiwania danych po stronie serwera, przez co do aplikacji trafiają tylko odfiltrowane dane, które są dla niej istotne. Program chcąc odczytać bądź zmodyfikować dane, musi korzystać z pośrednictwa SZBD. Aby to jednak było możliwe, SZDB i aplikacja muszą móc się „porozumieć”, co symbolizowane jest na rysunku przez przecinające się elipsy, lecz – jak widać – do danych bezpośredni dostęp ma jedynie SZBD.



3. Typy bazy danych

Bazy danych można podzielić według struktur organizacji danych, których używają:

Bazy proste:

bazy kartotekowe

hierarchiczne bazy danych

Bazy złożone:

bazy relacyjne

bazy obiektowe

bazy relacyjno-obiektowe

strumieniowe bazy danych

temporalne bazy danych

bazy nierelacyjne (NoSQL)

Z wymienionych struktur, w praktyce zdecydowanie najczęściej używane są bazy relacyjne.



a) BAZY KARTOTEKOWE

Kartotekowa baza danych (lub prosta baza danych) - baza danych złożona z jednej tablicy, która zawiera identyczną strukturę pól. Każda tablica danych jest samodzielnym dokumentem i nie może współpracować z innymi tablicami, w przeciwieństwie do relacyjnej bazy danych.Przykładami kartotekowej bazy danych są spisy danych osobowych czy spisy książek lub płyt. Poniższa baza składa się z jednej tabeli zawierającej 3 rekordy, z których każdy ma 4 pola.

Dane w kartotekowych bazach danych można sortować, przeszukiwać, stosować w nich filtry ograniczające zakres wyświetlanych informacji.Kartotekowe bazy danych można tworzyć w dowolnym programie zarządzającym bazami danych czy w arkuszach kalkulacyjnych, a nawet w prostych edytorach tekstów (pliki z wartościami oddzielanymi przecinkami - CSV, lub tabulatorami - TSV). Specjalne programy do tworzenia tego rodzaju baz są też dołączane do pakietów zintegrowanych, jak Microsoft Works. Użytkownik może w nich utworzyć nie tylko samą bazę, czyli tabele z danymi, ale i graficzny interfejs użytkownika, definiując położenie pól i dołączając rozmaite elementy uboczne powtarzające się przy przeglądaniu rekordów, jak np. grafikę.

b) BAZY RELACYJNE
Model relacyjny – model organizacji danych bazujący na matematycznej teorii mnogości, w szczególności na pojęciu relacji. Na modelu relacyjnym oparta jest relacyjna baza danych (ang. Relational Database) – baza danych, w której dane są przedstawione w postaci relacyjnej.W najprostszym ujęciu w modelu relacyjnym dane grupowane są w relacje, które reprezentowane są przez tablice. Relacje są pewnym zbiorem rekordów o identycznej strukturze wewnętrznie powiązanych za pomocą związków zachodzących pomiędzy danymi. Relacje zgrupowane są w tzw. schematy bazy danych. Relacją może być tabela zawierająca dane teleadresowe pracowników, zaś schemat może zawierać wszystkie dane dotyczące firmy. Takie podejście w porównaniu do innych modeli danych ułatwia wprowadzanie zmian, zmniejsza możliwość pomyłek, ale dzieje się to kosztem wydajności.

Schemat modelu relacyjnego

4.Struktura bazy danych
 

- Rekord (z ang. zapis, wpis do rejestru, dziennika) to zestaw danych, zazwyczaj posiadający ustaloną wewnętrzną strukturę, stanowiący pewną całość, ale mogący być częścią większego zbioru podobnych rekordów. Termin ten odnosi się do kilku różnych konkretnych zastosowań:w programowaniu rekord to obiekt (wartość, zmienna) posiadający pewną wewnętrzną niejednorodną strukturę.w bazach danych rekord to pojedynczy wpis do bazy,niektóre przestrzenie na nośnikach danych również nazywane są rekordami, np. zerowy sektor dysku: master boot record.
Rekord w bazie danych jest konstrukcją analogiczną do rekordu w języku programowania. Posiada strukturę wewnętrzną — podział na pola o określonym typie. Rekordem może być wiersz pliku tekstowego, a pola mogą być określone poprzez pozycję w wierszu lub oddzielane separatorami. W relacyjnych bazach danych rekord to jeden wiersz w tabeli, czyli jedna krotka w relacji. Podczas przetwarzania wyników zapytań do bazy danych, które mogą zawierać połączone dane z kilku tabel, pojedynczy wiersz również jest nazywany rekordem. W niektórych językach (np. Pascal) można definiować interfejsy do operowania na plikach na poziomie rekordów; wtedy cały plik jest traktowany jak zbiór rekordów, a czytanie i pisanie realizowane jest całymi rekordami.
-Pole rekordu to po prostu pole z jakaś dana lub danymi Każda zmienna elementarna w rekordzie nazywana jest polem. Rekordy są używane najczęściej do przechowywania zawartości pojedynczego wiersza w bazie danych. Do klucza podstawowego odnoszą się inne tabele w bazie.
-Klucz główny (ang. Primary Key) – pojęcie z zakresu teorii relacyjnych baz danych. Oznacza wybrany minimalny zestaw atrybutów relacji, jednoznacznie identyfikujący każdą krotkę tej relacji. To oznacza, że taki klucz musi przyjmować wyłącznie wartości niepowtarzalne i nie może być wartością pustą (null). Ponadto każda relacja może mieć najwyżej jeden klucz główny.Kluczem głównym może być dowolny klucz potencjalny, ale często stosuje się rozwiązanie polegające na utworzeniu specjalnego atrybutu, którego wartości domyślne pobierane są z sekwencji (tzw. autonumeracja), tak aby zapewnić unikalność klucza.
5.Obsługa Bazy Danych
5) Obsługa Baz danych




-Formularze
-Formularze są też określane jako „ekrany wprowadzania danych”. Stanowią one interfejs do pracy z danymi i często zawierają przyciski umożliwiające wykonywanie różnych poleceń. Można utworzyć bazę danych bez korzystania z formularzy, edytując dane w arkuszach danych tabel. Większość użytkowników baz danych woli jednak używać formularzy do przeglądania, wprowadzania i edytowania danych przechowywanych w tabelach.
Formularze usprawniają pracę z danymi, udostępniając łatwy w użyciu interfejs, a także umożliwiając dodawanie elementów funkcjonalnych, takich jak przyciski poleceń. Po odpowiednim zaprogramowaniu przyciski umożliwiają określanie danych wyświetlanych w formularzu, otwieranie innych formularzy lub raportów oraz wykonywanie wielu innych zadań. Przykładem może być formularz o nazwie „Formularz klienta” służący do pracy z danymi klienta. Taki formularz może zawierać przycisk otwierający formularz zamówienia, który pozwala wprowadzić nowe zamówienie dla danego klienta.
Dzięki formularzom można określać sposoby interakcji użytkowników z danymi zawartymi w bazie danych. Można na przykład utworzyć formularz wyświetlający tylko wybrane pola i udostępniający tylko określone operacje. Ułatwia to ochronę i poprawne wprowadzanie danych.
 
-Raporty
Raporty służą do podsumowywania i wyświetlania danych zawartych w tabelach. Zazwyczaj raport umożliwia odpowiedź na określone pytanie dotyczące danych, na przykład „Ile pieniędzy otrzymaliśmy od poszczególnych klientów w tym roku?” lub „W jakich miastach mają swoje siedziby nasi klienci?” Każdy raport można sformatować w sposób zwiększający czytelność danych.
Raport można uruchomić w dowolnym momencie, przy czym zawsze będzie on odzwierciedlał bieżące dane znajdujące się w bazie danych. Raporty są zazwyczaj formatowane z myślą o ich drukowaniu, ale można też wyświetlać je na ekranie, eksportować do innych programów lub wysyłać jako wiadomości e-mail.

-Kwerendy

Kwerendy stanowią podstawowe narzędzie baz danych, które może spełniać wiele różnych funkcji. Najczęściej są one używane do pobierania określonych danych z tabel. Często dane, które mają być pobrane, znajdują się w kilku tabelach — kwerendy pozwalają przeglądać takie dane w jednym arkuszu danych. Poza tym nie zawsze jest konieczne wyświetlanie wszystkich rekordów, dlatego przy użyciu kwerend można określać odpowiednie kryteria „filtrowania” danych, aby uzyskać dostęp tylko do potrzebnych rekordów. Kolejnym zastosowaniem kwerend jest dostarczanie danych dla formularzy i raportów.Niektóre kwerendy umożliwiają edytowanie danych w tabelach źródłowych za pomocą arkusza danych kwerendy. W przypadku używania kwerend aktualizujących należy pamiętać, że zmiany zostaną wprowadzone w tabelach, a nie tylko w arkuszu danych kwerendy.
Istnieją dwa podstawowe typy kwerend: kwerendy wybierające i kwerendy funkcjonalne. Kwerenda wybierająca pobiera dane i udostępnia je. Można wyświetlić wyniki takiej kwerendy na ekranie, wydrukować je lub skopiować do schowka. Wyniki kwerendy mogą też posłużyć jako źródło rekordów dla formularza lub raportu.
Kwerenda funkcjonalna, jak wskazuje jej nazwa, służy do wykonywania zadań związanych z danymi. Kwerendy funkcjonalne umożliwiają tworzenie nowych tabel, dodawanie danych do istniejących tabel oraz aktualizowanie i usuwanie danych.

6.Przykłady bazy danych


-książka telefoniczna,
-katalog biblioteczny,
-dziennik lekcyjny,
-system ewidencji ludności PESEL,
-zestawienie towarów w magazynie hurtowni,
-kartoteka chorych w przychodni lekarskiej,
-rozkład jazdy