Zrozumieć bazy danych

Jak przechowywano i analizowano dane dawniej, zanim powstały komputery? Pamiętam jednego sklepikarza, który sprzedawał obok naszego domu. Zapisywał do zeszytu wszystkie kwoty sprzedawanych produktów. Po zakończonych zakupach każdego klienta oddzielał je linią i pod spodem wpisywał sumę. Gdyby chciał podliczyć obroty każdego dnia wystarczyło zsumować te kwoty. Sprawa prosta. Prosta ale tylko dlatego, że był to mały sklepik lokalny. Produktów było niewiele a gdy się kończyły, wiadomo było co zamówić. A co z poważniejszymi sklepami, bibliotekami i z urzędami?

Gdyby pani bibliotekarka za każdym razem musiała przepisywać tytuły książek do zeszytów, chyba by się wściekła. Ile razy można powielać to samo? Łatwiej było opisać książkę numerkiem i odnosić się do niej za jego pomocą. W sumie, to wszystkiemu można by ponadawać numery. Książce w bibliotece, produktom spożywczym, a nawet ludziom. Każdy ma przecież swój PESEL. Jest mnóstwo numerów w użyciu, które jednoznacznie identyfikują osobę, przedmiot albo jakąś strukturę prawną (NIP, REGON, KRS). Te numery są używane do dzisiaj i wspomagają pracę komputerów.

Wyobraź sobie, że chcesz za pomocą kilku zeszytów zorganizować pracę biblioteki. Jak byś to zrobił żeby w szybki sposób dokładnie opisać co dzieje się z poszczególnymi książkami? Czy w jednym zeszycie opisywałbyś szczegółowe informacje, takie jak data, tytuł książki, imię i nazwisko wypożyczającego oraz jego adres? A co jeśli ta osoba się przeprowadzi? A jeśli zawarła małżeństwo i zmieniła nazwisko? Widać wyraźnie, że takie rozwiązanie jest po pierwsze mało wydajne, a po drugie niedokładne.

Spróbujmy innego rozwiązania. Kiedy rejestruje się ktoś w bibliotece, niech dostanie nowy numer. To samo zróbmy z książkami. Kiedy biblioteka zakupuje nową książkę niech ma nowy kolejny numer. Potrzebny byłby jakiś indeks czyli uporządkowany spis tych wszystkich numerów. Za pomocą takiego indeksu moglibyśmy alfabetycznie poukładać nazwiska lub tytuły książek. Wtedy łatwo byłoby odszukać konkretną osobę, lub książkę, sprawdzić jej numer a następnie przypisać numer książki, numerowi człowieka.

Ktoś może zapytać: a dlaczego nie przydzielać numerów od razu alfabetycznie tylko tworzyć jakiś indeks? To nie byłoby mądre. Przecież liczba książek i klientów stale rośnie. Nie możemy za każdym razem zmieniać numeracji gdy tylko pojawi się ktoś lub coś nowego. Okazuje się, że prowadzenie posortowanego indeksu wcale nie jest czasochłonne, a pozwala odnaleźć bardzo szybko dowolne informacje.

Jeśli więc przy wypożyczaniu książki miałbyś do wpisania jedynie datę, termin zwrotu, numer klienta i numer książki, byłoby łatwiej. To będzie działać dobrze nawet jeśli klient się przeprowadził i trzeba mu wysłać upomnienia na jego nowy adres. No w porządku, ale jaki to ma związek z Microsoft SQL Server albo jakimikolwiek innymi bazami danych? Jeśli dobrze zrozumiałeś ten temat i problemy związane z dopisywaniem danych, jesteś gotowy na najważniejsze.

Komputery przyśpieszają pracę

W latach 90 często budowano bazy danych w oparciu o moduł dołączony do programu. Były to plikowe bazy danych. Można było podłączyć się do pliku, zapisywać i odczytywać dane. Wadą było korzystanie z tych danych przez kilka komputerów jednocześnie. Poza tym rozmaitość bibliotek, niespójne metody zapisywania i odczytywania utrudniały efektywne pisanie programów. W tym artykule omawiamy serwery bazodanowe. Są to rozwiązania wolne od wspomnianych wad. Serwer bazy danych jest osobnym mechanizmem. Zadaniem programisty jest po prostu nawiązać połączenie za pomocą interfejsu i wykonywanie zadań za pomocą dość standardowego języka SQL lub za pomocą innego współczesnego interfejsu (np. Linq To SQL albo .NET Framework).

Są oczywiście jeszcze bardziej zaawansowane rozwiązania. Można sprząc kilka serwerów bazodanowych by przyśpieszyć pewne operacje. Można też zbudować usługi sieciowe, które będą dzieliły się danymi z dowolnymi serwerami lub klientami. Ale o tym innym razem.

Organizacja danych w bazie

Tak jak dane kiedyś zapisywano w zeszytach, tak komputer zapisuje je w bazie danych. Nowo wstawiane dane są dopisywane do automatycznie wybranego miejsca w bazie danych. Microsoft SQL Server pracuje na stronach, czyli blokach pamięci po 8KB każdy. Dla komputerów to świetne rozwiązanie, bo łatwo odnaleźć dowolny fragment bazy danych na dysku twardym. Strona mieści w sobie tyle rekordów (wpisów) ile się na niej zmieści. Na stronach może być trochę wolnego miejsca. Oprócz pliku bazodanowego, serwer Microsoft SQL korzysta z plików logs. Nie chodzi w tym wypadku o logi błędów, ale o zapisywanie każdej operacji jaka została rozpoczęta. Dzięki logom, nawet w wypadku awarii serwera jest możliwe wykonanie rozpoczętych operacji i transakcji jeśli jeszcze nie zostały zapisane do pliku danych lub wycofanie całych niedokończonych transakcji.

Gdy serwer wstawia dane, wyszukuje jakieś odpowiednio duże wolne miejsce na którejś stronie, najpierw wpisuje zadanie do pliku logs i w odpowiedniej chwili podejmuje akcję nadpisania całej modyfikowanej strony (serwer nie bawi się w zapisywanie pojedynczych bajtów, bo to strata czasu). Kolejne dane zapisywane są z reguły po kolei, ale niekoniecznie. Gdy na określonej stronie danych pojawiła się dziura po usunięciu czegoś z bazy, całkiem możliwe że nowy rekord zalepi właśnie tę dziurę. Taki efekt trudno byłoby uzyskać w zeszycie, chyba żeby pisać ołówkiem. W takim wypadku automatycznie tworzone indeksy klucza głównego będą na dysku twardym zapisane nie po kolei. Na szczęście nie ma to dla nas większego znaczenia. Gdy zadajemy serwerowi zadanie, to serwer martwi się w jakiej kolejności ma zwrócić te dane. Jeśli jednak nie posortujemy danych, czasem może się zdarzyć że wrócą do nas w kolejności zapisu w bazie.

Po co są tabelki i kolumny?

Tabelki to właściwie nasze dane. Tabelki można by przyrównać do zeszytów o których wspomnieliśmy na początku. Różne tabelki są przeznaczone do zapisywaniu różnych rodzajów danych, np. książek, osób, spisu kolejno wypożyczonych książek, itp. Poszczególne tabelki są utworzone z myślą tylko o określonym przeznaczeniu i nie powinny przechowywać innych rodzajów danych.

A kolumny to po prostu definicje poszczególnych najmniejszych rodzajów danych. W tabelce książki, będą to dla uproszczenia: identyfikator książki oraz tytuł. W tabelce osoby, będą to: identyfikator osoby, imię, nazwisko, telefon, ulica, numer domu, kod pocztowy, miejscowość, data zapisania do biblioteki. W tabelce wypożyczenia będą to: identyfikator wypożyczenia, data wypożyczenia, termin do oddania, identyfikator wypożyczanej książki, identyfikator osoby która wypożycza. Proste.

Dane wpisujemy kolejno. Uzupełniamy tabelkę książek, osób i zaczynamy pracę. Najciekawiej zaczyna się, gdy pierwszy czytelnik wypożycza książkę. Co dzieje się w bazie danych? Wstawiany jest nowy wiersz (wpis lub rekord, jak kto woli) z wartościami:

  • identyfikator wypożyczenia – liczba wstawiana jest automatycznie przez bazę danych
  • data wypożyczenia: dzisiaj, automatycznie generowana data za pomocą pisanego programu z możliwością zmiany na inną (ponieważ gdyby zabrakło prądu i trzeba by było przepisać listę z wypożyczeń z wczoraj, lepiej nie automatyzować brutalnie)
  • termin do oddania: automatycznie proponowana data przez program z możliwością zmiany
  • identyfikator wypożyczanej książki: liczba pobrana przez program, taka sama jak liczba automatycznie wygenerowana przez bazę danych w momencie dodawania tego tytułu książki
  • identyfikator czytelnika: liczba pobrana przez program, taka sama jak liczba automatycznie wygenerowana przez bazę danych w momencie dodawania tego czytelnika do naszej bazy.

Jak się kontaktować z bazą?

Bez względu na interfejs dostępne są 4 podstawowe metody: dodawanie, odczytywanie, modyfikowanie, usuwanie. W języku SQL te 4 operacje zawsze mają identyczne angielskie nazwy: INSERT, SELECT, UPDATE, DELETE. W programowaniu obiektowym te same operacje, ale krok wcześniej, czyli jeszcze w aplikacji określa się jako CRUD -Create, Update, Read, Delete).

Gdybyśmy chcieli dodać książkę musielibyśmy kazać bazie danych wykonać operacje:

INSERT INTO Ksiazki (Tytul) VALUES (N'Duma i uprzedzenie')

Gdybyśmy chcieli odnaleźć identyfikator takiej książki, moglibyśmy wyszukać dane za pomocą

SELECT * FROM Ksiazki WHERE Tytul = N'Duma i uprzedzenie'

lub

SELECT * FROM Ksiazki WHERE Tytul LIKE N'%Duma%'

Gdybyśmy znali identyfikator (załóżmy, że jest to 1) i chcieli zmienić tytuł wpisalibyśmy

UPDATE Ksiazki SET Tytul = N'Duma i Uprzedzenie' WHERE Id_Ksiazki = 1

A gdybyśmy chcieli usunąć ten wpis z bazy wpisanybyśmy

DELETE FROM Ksiazki WHERE Id_Ksiazki = 1

A o co chodzi z tymi literkami N i %? N przed apostrofem oznacza, że zapisujemy znaki w formacie Unicode. Będą więc odporne na polskie litery. A procent zastępuje dowolną treść w wyszukiwaniach LIKE. % nie działa w zwykłym wyszukiwaniu =.

Co więc oznacza LIKE N’%Duma%’? Oznacza że szukamy wszystkiego co ma w sobie wyraz Duma.

Tworzenie bazy danych

Bazę danych można tworzyć za pomocą Microsoft SQL Server Management Studio (MSSMS). Można też to robić za pomocą skryptów, ale o tym innym razem.

Zapraszam do eksperymentowania!

About the author

Lester Forestjump

View all posts