Najważniejsze zagadnienia, które musisz znać
5 godz. 53 min · JavaScript · Full-stack i Programowanie
Adam GospodarczykPrzesyłanie oraz transformacja danych to jeden z najważniejszych elementów działania każdej aplikacji. Dobre zrozumienie tego w jaki sposób odbywa się ten proces, daje równocześnie lepsze zrozumienie całej struktury oraz podejmowania decyzji projektowych. W tym kursie znajdziesz lekcje, które pozwolą Ci uporządkować wiedzę na temat protokołu HTTP oraz formatów wymiany danych.
REST oraz GraphQL to nadal nieodłączone zagadnienia tematu wymiany informacji w kontekście aplikacji webowych. Pomimo tego, że ich koncepcje zwykle są bardzo dobrze opisane w różnych źródłach, tak ich wykorzystanie "na produkcji" potrafi sprawić problemy. W szczególności gdy weźmiemy pod uwagę, wyjątki oraz fakt, że nie każda aplikacja będzie wymagać implementacji REST czy GraphQL w 100%. W tym kursie znajdziesz wiele praktycznych wskazówek związanych z pracą z REST API oraz wprowadzenie do pracy z GraphQL.
Niektóre błędy w aplikacji są bardzo pożądane, w szczególności gdy jasno informują użytkownika o tym, co się wydarzyło oraz o tym, co może z tym zrobić. Pomimo tego, że w wielu przypadkach opracowanie komunikatów leży w rękach osoby odpowiedzialnej za copywriting (i/lub ux writing), tak sama implementacja tych komunikatów odbywa się po stronie kodu. Nie rzadko okazuje się, że poprawna i skuteczna walidacja danych oraz obsługa błędów nie jest oczywista w "produkcyjnych" sytuacjach. W tym kursie znajdziesz najczęściej spotykane problemy oraz sposoby ich rozwiązania.
Bazy danych są praktycznie nieodłączną częścią każdej aplikacji. W roli full-stacka prędzej czy później przyjdzie Ci z nimi pracować a nie rzadko nawet projektować oraz rozbudowywać ich struktury. W tym kursie znajdziesz informacje o bazach danych, które pozwolą Ci je zrozumieć oraz od razu poznać użyteczne techniki, które pomogą Ci w pracy z nimi, zarówno na produkcji jak i w środowisku lokalnym czy testowym.
Nie wszystkie informacje w aplikacji są publiczne. Niektóre wprost nie mogą takie być. Z tego powodu niezbędne są sposoby na to aby poznać a potem weryfikować tożsamość użytkownika, by na jej podstawie przydzielać mu dostęp wyłącznie do zasobów, do których odczytywania posiada uprawnienia. Istnieje wiele technik, które umożliwiają zarządzanie dostępem do danych i w tym kursie poznasz najważniejsze z nich. Dowiesz się nie tylko w jaki sposób zabezpieczać dane ale poznasz też najpopularniejsze sposoby na to aby te zabezpieczenia łamać i obchodzić. Mając świadomość takiej możliwości, będziesz w stanie lepiej podejmować decyzje o tym jak projektować dostęp do informacji.
Istnieją problemy charakterystyczne dla niemal każdej aplikacji. W związku z ich powszechnością, istnieje też szereg rozwiązań lub sposobów na to, aby możliwie zredukować ich następstwa. Na przestrzeni lekcji tego kursu zobaczysz wiele przykładów, które pomogą Ci w codziennej pracy a niekiedy nawet, pozwolą uniknąć błędów, których konsekwencje nie zawsze występują natychmiast.
Kurs powstał z myślą o osobach, które chcą rozwijać się w roli full-stack web developera / developerki, przeprowadzając przez najważniejsze zagadnienia z obszaru wymiany, transformacji oraz przechowywania informacji w aplikacji oraz pomiędzy aplikacjami. Jeżeli potrzebujesz zobaczyć szeroką perspektywę tego, w jaki sposób dane przepływają pomiędzy różnymi częściami aplikacji, lub ugruntować swoją wiedzę na ten temat, to ten kurs jest miejscem, którego szukasz.
W tej lekcji pokażę Ci rodzaje relacji, a przynajmniej te najpopularniejsze, które
występują w przypadku zarówno składowych, jak i składowych baz danych.
Pierwszym rodzajem połączenia jest połączenie,
które zachodzi pomiędzy tabelami, tak jak pokazywałem w jednej z poprzednich lekcji.
Chodzi o to, że poszczególne wiersze tych
tabel połączone są ze sobą identyfikatorem.
Konkretnie użytkownicy posiadają swoje identyfikatory, a do tabeli Profile jest
po prostu odniesienie do wiersza z tabeli users.
Dzięki temu jesteśmy w stanie napisać zapytanie pobierające informacje o
użytkowniku oraz o profilu, który posiada jego identyfikator.
I teraz jeżeli chodzi o taką relację, to
nieco inaczej wygląda to w przypadku MongoDB.
Po pierwsze jeżeli chodzi o relacje
to faktycznie też już powiedzieliśmy sobie, że możemy po prostu przechowywać
tablicę identyfikatorów wskazującą na inną kolekcję.
Z drugiej jednak strony możemy mieć też relację, czyli relację jeden do kilku.
W tym przypadku mowa np.
o sytuacji, w której mamy rolę użytkownika
i nie ma potrzeby tworzenia oddzielnej kolekcji, aby je przechowywać.
Tylko w zamian przechowujemy je
bezpośrednio w tablicy pola przechowywanego wewnątrz danego dokumentu.
Dzięki temu nie ma tutaj tej złożoności, która występuje w przypadku tabel oraz też
pobieranie tych informacji jest zdecydowanie prostsze.
Pamiętaj tylko proszę o tym, że w momencie gdy łączyć ze sobą informacje w taki
sposób, musisz pamiętać o pewnych ograniczeniach.
Mianowicie teoretycznie możesz mieć tutaj
stosunkowo dużo informacji zapisanych wewnątrz takiej tablice.
Jednocześnie jeżeli będzie ich zbyt dużo,
doprowadzi to do dużej wagi samego dokumentu i za każdym razem, gdy będziesz
go pobierać, będziesz pobierać też cały zestaw danych.
W związku z tym w momencie, gdy faktycznie
masz tylko kilka powiązań, nie ma problemu, aby wykorzystać tutaj embedded.
Natomiast w przypadku, gdy tych elementów będzie więcej bądź będą bardziej
rozbudowane, warto zobaczyć tutaj referencję do innej kolekcji.
Kolejnym rodzajem relacji jest relacja Onetu maszyny, czyli jeden do wielu.
W przypadku. Tutaj struktura tabeli wygląda dokładnie
tak samo jak w poprzednim przykładzie, aczkolwiek różnica polega na tym, że np.
tutaj nic nie stoi na przeszkodzie, aby jeden użytkownik miał przypisanych np.
wiele różnych artykułów.
Coś takiego jak najbardziej odzwierciedla sytuację, do której może dojść i
jednocześnie też takie powiązanie jest uzasadnione.
W momencie, gdy rozwijamy funkcje naszej aplikacji, takie jak np.
wyświetlanie artykułów powiązanych z danym użytkownikiem.
Warto tutaj jeszcze pamiętać o tym, o czym
jeszcze do tej pory nie zdarzyło mi się wspomnieć.
Mianowicie w przypadku tych
identyfikatorów mówimy o tak zwanym kluczu obcym.
Oznacza to, że tabela articles posiada swój klucz główny, ale też posiada klucze
obce, które są powiązane z konkretną tabelą.
Zatem teoretycznie moglibyśmy tutaj
doprowadzić do sytuacji, w której artykuły są powiązane z jeszcze jedną tabelą i
również wewnątrz tej kolumny będą zapisane identyfikatory np.
1.
Nie będzie to jednak odgrywało większej roli, ponieważ kolumny zawierające klucze
obce są powiązane ze ściśle określonymi tabelami.
I teraz, jeżeli spojrzymy sobie, jak taka relacja wygląda w przypadku MongoDB,
to tak naprawdę nie ma tutaj zaskoczenia, ponieważ po prostu mamy tablicę
zawierającą listę identyfikatorów pochodzących z innej kolekcji.
Jednocześnie też nie ma tego ścisłego powiązania pomiędzy tą konkretną kolekcją,
ale to Twoja aplikacja definiuje skąd pobierane są te konkretne informacje.
Ostatnim rodzajem relacji jest relacja,
w przypadku której mówimy o powiązaniu wiele do wielu.
Przykładem może być chociażby wspomniane
wcześniej rola użytkownika, w przypadku których jeden użytkownik może posiadać
wiele różnych ról ze względu na proces normalizacji.
Musimy tutaj wykorzystać dodatkową tabelę pomocniczą, która będzie wiązać nam
rekordy z tabeli Users z rekordami z tabeli.
W rezultacie tworzymy tabelę Users,
wewnątrz której posiadamy klucz główny oraz dwa klucze obce, z czego jeden
wskazuje na rekordy z tabeli users, a drugi na rekordy z tabeli.
W przypadku MongoDB sytuacja jest to
zdecydowanie prostsza ze względu na to, że potrzebujemy tylko dwie kolekcje, wewnątrz
których na przykład jeżeli mamy użytkownika, do którego są przypisane
zadania, po prostu przechowujemy identyfikatory tych zadań.
Z drugiej jednak strony w przypadku samych
zadań posiadamy również właścicieli bądź też osoby przypisane do tych zadań.
I tutaj ponownie wystarczają identyfikatory tych konkretnych wpisów.
Trzeba jednak pamiętać o pewnego rodzaju
możliwościach i jednocześnie ograniczeniach MongoDB.
Mianowicie, tak jak powiedziałem, nie możemy doprowadzić do sytuacji polegającej
na tym, że wewnątrz jednej tablicy będziemy mieć np.
miliony rekordów.
Takim sztandarowym przykładem jest
sytuacja, w której przechowujemy logi serwera wewnątrz naszej bazy.
I tutaj przykładowo mamy hosty, czyli np.
nasz główny serwer, w ramach którego możemy mieć potrzebę zapisywania logów,
zamiast przechowywać tutaj identyfikatory logów.
Z tym hostem, to realizujemy tutaj odwrotną relację, polegającą na tym, że w
kolekcji logs wskazujemy na hosta, z którym są powiązane.
Dzięki temu, niezależnie od tego, ile tych
dokumentów będzie, nigdy nie doprowadzimy do sytuacji, w której np.
przekroczymy limit na jeden dokument, który wynosi 16 MB.
Zatem jeżeli spojrzymy na sposoby projektowania i łączenia
informacji zarówno w tabelach, jak i kolekcjach, to zobaczymy pomiędzy nimi
trochę analogii, ale jednocześnie samo podejście zasadniczo się różni.
Jeżeli zdecydujesz się na bazę MongoDB, pamiętaj, że Twoim nadrzędnym celem nie
jest to, aby odwzorowywać techniki, które może znać np.
z relacyjnych baz danych, ale to, aby dostosować strukturę dokumentów do Twojej
aplikacji i do tego, w jaki sposób potrzebujesz pracować z tymi danymi.
Jeżeli chodzi o praktyczne wykorzystanie
tej wiedzy, to wydaje mi się, że nie pozostaje nic innego jak np.
wykorzystanie najlepiej do tego, aby postawić sobie nowy projekt, wewnątrz
którego skonfigurujemy sobie bazę w SQL, bądź też np.
MongoDB i po prostu pobawimy się w
projektowanie przykładowo w charakterystycznej dla zwykłego bloga,
bądź na przykład serwisu z ogłoszeniami o pracę.
Możesz to potraktować jako zadanie domowe, aczkolwiek muszę zaznaczyć, że warto je
odłożyć na czas po tym, jak przejdziemy sobie przez proces projektowania bazy
danych wspólnie w ramach projektu realizowanego.
Czy jest na ten moment jednak to byłoby na
tyle, więc dziękuję Ci za uwagę i zapraszam do kolejnych materiałów.