Skoro Twoja „Cyfrowa Książka Kucharska” ma już elegancką salę restauracyjną (Frontend), sprawną kuchnię z agentami AI (Backend) oraz niezawodnego kelnera (API), pora zadbać o element, bez którego żaden z tych filarów nie mógłby sprawnie funkcjonować: spiżarnię. I w tym rozdziale postaram się przybliżyć wam właśnie temat baz danych, które działają jak pewnego rodzaju pojemniki w których będziemy trzymali dane.
Systemu przechowywania danych (nasza spiżarnia)
Czym są bazy danych i dlaczego są niezbędne do tworzenia aplikacji? Można pomyśleć, że przecież wszystko wygodnie trzymać w plikach na naszym komputerze, jednak jeśli właśnie tak zdecydowalibyśmy się przetrzymywać nasze dane zaczynają się problemy.
Pliki(Worki z przepisami):
Przetrzymywanie danych w plikach na naszym komputerze jest najprostszym rozwiązaniem, jakie możemy wybrać, jest to dla nas intuicyjne ponieważ korzystając z komputera nawet mimowolnie nauczyliśmy się z nich korzystać. Jednak czy proste zawsze oznacza dobre? Niekoniecznie, wszystko jest świetnie jeśli mielibyśmy tylko trzy dania które jedlibyśmy non stop. Wtedy przetrzymywanie w plikach jest świetnym rozwiązaniem. Jest proste, szybkie i łatwo można znaleźć co tylko chcemy pod warunkiem, że to jedno z tych trzech dań. Niestety w praktyce prawie nikt nie ogranicza swojego jadłospisu do trzech takich samych dań dziennie, dajmy na to jeśli tygodniowo chcielibyśmy mieć trzy różne posiłki to musielibyśmy przeszukać już dwadzieścia jeden plików, a w miesiącu prawie sto. Teraz sprawa się komplikuje i właśnie dzięki bazom danych taki problem można bardzo łatwo rozwiązać
Bazy Danych(Podpisane półki z przepisami):
Jak wspomniano w powyższym paragrafie bazy danych służą do przechowywania różnych informacji które chcielibyśmy zapisywać takich jak przepisy, listy zakupów czy nawet zdjęcia naszych pysznych potraw. Co lepsze pozwalają one nie tylko przetrzymywać dane ale i znacznie ułatwiają ich przeszukiwanie co eliminuje nasz problem który napotkaliśmy w przypadku plików.
Rola bazy danych w cyklu życia aplikacji
Spiżarnia jako “Single Source of truth”
Baza danych stanowi fundamentalny element każdej nowoczesnej aplikacji internetowej ponieważ pozwala nam zobaczyć co faktycznie znajduje się np w przepisie którego szukamy. Pewnie każdy z nas zgodnie stwierdziłby że dodanie ryby do carbonary nie byłoby najlepszym pomysłem tak samo jak brak cukru gdybyśmy chcieli ukręcić kogel mogel. Właśnie bazy danych odpowiadają za to że w naszym przepisie nie pojawi się nagle coś co nie powinno się tam znaleźć lub że nie zabraknie czegoś co jest niezbędne, (zakładając oczywiście, że przepis został dobrze podany). Patrząc na to technicznie mamy pewność że jeśli jakiś proces spodziewa się otrzymania pewnej danej to pojawi się ona tam jeśli jest w bazie danych.
Wielka księga przepisów
Baza danych nie tylko pilnuje żeby coś niepożądanego nie znalazło się w złym miejscu ale dzięki ograniczeniom (constraints) sprawia że nie możemy dodać czegoś co tylko utrudniłoby nam zadanie. Np. przepisu bez kroków jak go wykonać czy bez tytułu i zdjęcia czym on jest.
Jaka baza? (Jak wyposażyć naszą kuchnię)
Jak wcześniej wspomniano przy opisie zapisu danych do plików nie zawsze wszystko jest takie proste jak się wydaje. Dokładnie tak jest też tutaj, mimo tego że baza danych jest niezbędnym elementem aplikacji to nie każda półka dobrze będzie pasowała do naszego projektu. Dokładnie tak jak w cukierni cała szafka pieprzu nie byłaby zbyt przydatna a nawet mogłaby wprowadzać chaos podczas szukania czegoś co by się nam przydało. Tutaj zachodzi taka sama zależność w teorii możemy zastosować każdą bazę danych ale, nie zawsze będzie ona optymalnie działała w naszym systemie.
W poniższej tabeli przedstawiono cechy dwóch najpopularniejszych typów baz danych które za chwilę poznamy bliżej.
| CECHA | BAZA SQL | BAZA NOSQL |
| RODZAJ | Baza relacyjna | Baza nierelacyjna |
| STRUKTURA | W bazie SQL dane są przechowywane w tabelach o określonej liczbie kolumn | Bazy nierelacyjne mogą mieć strukturę: dokumentową, grafową, klucz – wartość |
| RODZAJ STRUKTURY DANYCH | Stała struktura danych | Zmienna struktura danych |
| SKALOWALNOŚĆ | Wertykalna | Horyzontalna |
| ZAPYTANIA | Przeważnie jest to SQL | Sposób zapytań do bazy danych NoSQL zależy głównie od określonej bazy danych. Nie ma deklaratywnego języka zapytań. |
| NAJWAŻNIEJSZE CECHY | Integralność, spójność i stabilność danych | Skalowalność, elastyczność i szybkie zapytania |
Bazy danych SQL(Twoja uporządkowana księga inwentarzowa)
W świecie baz danych istnieje podział na dwa główne typy SQL(Structured Query Language) na których skupimy się w tym rozdziale oraz noSQL które omówimy za chwilę.
Relacyjne bazy danych
Relacyjny model danych można sobie wyobrazić jak profesjonalny segregator z przepisami gdzie każdy wiersz to konkretna karta dania, a kolumny to stałe rubryki takie jak np. imię autora składniki czy czas przygotowania.Tabela jest natomiast przejrzystą sekcją w Twoim kuchennym segregatorze, w której zbierane są wiersze i kolumny.
- Kolumny: W bazie danych skupiają w sobie jeden typ wartości np. Imię autora czy składniki.
- Wiersze: Mamy w nich opisane różne cechy jednej opisywanej przez nas rzeczy np. przepisu oznacza to że w jednym wierszu znajdą się zarówno ID przepisu, imię autora ale także składniki czy czas gotowania
- Tabele: Jest to połączenie kolumn i rzędów opisujące jeden typ danych
Na potrzebę obrazowego przedstawienia przygotowana została tabela w relacyjnej bazie danych ORACLE. Tabela obejmuje dwa przykładowe recordy czyli uporządkowane zbiory danych.
W czterech kolumnach które zawiera nasza przykładowa tabela znajdują się kolejno : ID czyli unikalny numer przepisu w bazie danych, IMIĘ_AUTORA – czyli po prostu imię osoby dodającej przepis, SKŁADNIKI – listę produktów potrzebnych do przygotowania dania, oraz CZAS_PRZYGOTOWANIA – czyli czas potrzebny na przygotowanie potrawy w minutach.
Zawartość wierszy obejmuje dwa przykładowe przepisy które czytamy od lewej do prawej, czyli przepis o ID 1 przygotowała Anna do wykonania jego będziemy potrzebować makaronu, pomidorów, czosnku i oliwy a samo przygotowanie zajmie nam ok 25 minut.
| ID | IMIE_AUTORA | SKŁADNIKI | CZAS_PRZYGOTOWANIA | |
| 1 | 1 | ANNA | makaron, pomidory, czosnek,oliwa | 25 |
| 2 | 2 | TOMEK | ciasto do pizzy, pomidory, czosnek, oliwa, salami | 25 |
Gigantyczna popularność relacyjnych baz danych wynika z kilku czynników takich jak:
- Łatwe wyszukiwanie informacji (np.znalezienie wszystkich przepisów zawierających pomidory) co możemy zrobić za pomocą zapytań SQL (SQL queries).
- Łączenie danych z różnych tabel(np. jeśli wiemy że Anna tworzy wspaniałe obiady ale jej desery pozostawiają sobie wiele do życzenia możemy w prosty sposób filtrować przepisy tak żeby pokazane były wyłącznie dania obiadowe które przygotowała Anna).
- Zachowanie spójności dzięki jasno określonym relacjom między tabelami (np. jeśli autor przepisów zmieni nazwisko to automatycznie zostanie ono zaktualizowane w całej bazie danych).
- Oraz co bardzo istotne wydajną pracę z dużymi zbiorami danych czyli nawet w przypadku gdyby nasza książka kucharska liczyła wiele tysięcy przepisów w prosty sposób jesteśmy w stanie znaleźć dokładnie te które nas interesują.
Bazy danych noSQL(Elastyczna spiżarnia przyszłości)
Skoro wiemy już czym są relacyjne bazy danych typu SQL przyjrzymy się drugiemu popularnemu wyborowi czyli bazom danych typu noSQL. O ile relacyjny model danych to profesjonalny segregator zawierający sztywne formularze, o tyle model noSQL w tym przypadku będący dokumentową bazą danych można wyobrazić sobie jako kreatywny notatnik, w którym każdy przepis jest osobną luźną notatką. Pozwala nam to ominąć odgórne narzucenie struktury przepisu co pozwala nam np. w jednym przepisie dodać tylko listę kroków, tytuł i składniki a w następnym dodać też historie dania która opowie nam skąd pochodzi przepis i jak wpadł w ręce osoby która zechciała się nim podzielić.
- Kolekcja jest to odpowiednik tabeli w relacyjnej bazie danych. Można traktować ją w tym przypadku jak “szufladę” w której przechowujemy różnorodne notatki. W jednej szufladzie możesz trzymać zarówno proste przepisy na kanapkę, jak i skomplikowane instrukcje pieczenia tortu z listą wielu pod-składników.
- Pola(Fields): To poszczególne informacje zapisane jako pary “klucz-wartość”, np. “Nazwa:Pizza” lub “Czas:30”. Pola te mogą być bardzo zróżnicowane i nie muszą powtarzać się w każdej notatce.
- Dokumenty(Documents): To pojedyncze karty z przepisami. W przeciwieństwie do wiersza w tabeli, dokument może zawierać w sobie zagnieżdżone listy (np.listę przypraw) lub mniejsze notatki (np.przepis na sos), co pozwala nam na tworzenie hierarchicznej struktury.
Na potrzeby obrazowego przedstawienia przygotowany został przykładowy dokument w dokumentowej bazie danych (MongoDB) zapisany w formacie JSON. Zawierający dwa recordy:
{
"id": 1,
"imie_autora": "Anna",
"skladniki": ["makaron", "pomidory", "czosnek", "oliwa"],
"czas_przygotowania": 25
}
{
"id": 2,
"imie_autora": "Tomek",
"skladniki": ["ciasto do pizzy", "pomidory", "czosnek", "oliwa", "salami"],
"czas_przygotowania": 25,
"dodatkowe_info": {
"poziom_trudnosci": "sredni",
"ulubione_przez_dzieci": true
}
}
jak widać record o id 2 zawiera zupełnie inną strukturę niż ten o id 1 co idealnie pokazuje właśnie elastyczność baz danych typu noSQL.
Caching (Podręczna półka na blacie)
Skoro mamy już naszą spiżarnię (bazę danych), pora zadać sobie pytanie: czy po każdą szczyptę soli warto biec do piwnicy? Odpowiedź oczywiście brzmi nie. Do tego właśnie służy caching.
Caching polega na przechowywaniu najczęściej potrzebnych rzeczy bliżej tych którzy o nie proszą, aby drastycznie zwiększyć szybkość dostępu.
Jeśli przyjmiemy że w naszej kuchni baza danych jest spiżarnią, to naszym cachem jest półka na kuchennym blacie. Zamiast co chwilę biegać do spiżarni po sól lub pieprz (co spowalnia gotowanie), kładziemy je bezpośrednio przed sobą.
Aby Twoja restauracja pracowała wydajnie, stosujemy trzy główne warstwy serwowania „gotowców”:
Kieszeń gościa (Browser Cache): Gość trzyma menu i wizytówkę u siebie, więc nie musi o nie pytać kelnera przy kolejnej wizycie
Lokalna budka z jedzeniem (CDN): Rozsiane po świecie punkty, które serwują zdjęcia dań z bliskiej odległości, by głodny gość nie musiał czekać na sygnał z Twojej głównej kuchni
Ściąga na blacie kucharza (In-memory cache/Redis): Mała kartka z najważniejszymi instrukcjami, dzięki której kucharz w milisekundę odpowiada na popularne pytania bez wertowania „Wielkiej Księgi Przepisów” w piwnicy
Ponieważ miejsce na blacie jest ograniczone, musisz stosować strategie sprzątania (cache eviction):
LRU: Odkładasz do spiżarni to, czego najdawniej nie używałeś.
Random Replacement: „Szalony kucharz” wyrzuca przypadkowy słoik, gdy brakuje miejsca.
TTL: Naklejasz na notatkę „zegar przydatności”, po którym trafia ona do kosza, byś zawsze pracował na świeżych danych.
Dzięki temu wielowarstwowemu podejściu Twoja kuchnia może obsługiwać miliony gości, zachowując tempo pracy godne gwiazdki Michelin.
Podsumowanie
Podsumowując, sprawnie działająca spiżarnia (baza danych) jest fundamentem każdej profesjonalnej kuchni, zapewniając bezpieczne przechowywanie informacji o produktach, zamówieniach i klientach. Dzięki wprowadzeniu cachingu, czyli naszej podręcznej półki na blacie, sprawiliśmy, że najczęściej potrzebne dane są zawsze pod ręką, co pozwala serwować „kulinarne gotowce” błyskawicznie i bez zbędnego biegania do piwnicy.
Jednak nawet najwspanialsza kuchnia z najlepiej zaopatrzoną spiżarnią nie wyda ani jednego posiłku, jeśli zabraknie prądu, czy piec przestanie działać. W kolejnym rozdziale przyjrzymy się światu DevOps i to właśnie tam dowiemy się jak np. automatyzować procesy wydawania potraw oraz jak dbać o to, by nasza “restauracja” była dostępna dla gości 24 godziny na dobę, bez względu na obciążenie.
W kolejnym rozdziale dowiesz się, jak zautomatyzować procesy wydawania potraw (CI/CD), aby kucharze mogli skupić się na gotowaniu zamiast na ręcznym sprawdzaniu każdego talerza. Przyjrzymy się też kontenerom (Docker), które gwarantują, że Twoje dania będą smakować identycznie w każdym zakątku świata. Dodatkowo dowiemy się czym jest Git czyli inteligentny dziennik przepisów gdzie wielu kucharzy może jednocześnie pracować nad swoim dziełem. Oraz Kubernetes czyli niezastąpiony kierownik sali który w razie awarii natychmiast wymieni wadliwy stolik. Przekonamy się, że tworzenie i utrzymanie aplikacji to jedna spójna całość, za którą odpowiada cały zespół.
Materiały
Materiały do samodzielnej nauki związane z tym tematem:
- Czym są bazy danych
- Nazewnictwo w bazach danych
- Jak dane są przechowywane w bazie danych
- Przechowywanie danych w storage vs w bazie danych
- Strategie cache’owania REST API
- Podstawy SQL – wideo
- Rodzaje baz danych w.1
- Rodzaje baz danych w.2
- Projektowanie bazy danych w.1
- Projektowanie bazy danych w.2
- Czym jest schemat bazy danych
- Czym jest cachowanie
- Wprowadzenie do technologii Elasticsearch
