NoSQL vs SQL, czyli kiedy i jaki typ bazy danych wybrać

Piotr Rzeźnik | Bazy danych | 16.02.2022

NoSQL vs SQL

Jednym z nieodłącznych elementów i zarazem wyzwań każdego projektu informatycznego jest kwestia przechowywania i przetwarzania dużych ilości danych. Na rynku dostępnych jest wiele rodzajów baz danych, a wybranie właściwej nie zawsze jest łatwe – głównym wyzwaniem jest tutaj wierne i logiczne odwzorowanie rzeczywistych procesów biznesowych danej domeny. Zatem kiedy i jaką bazę danych wybrać? Jakie bazy danych są dostępne? I w końcu – jakie możliwości dają nierelacyjne bazy danych NoSQL?

Typy baz danych

Do najpopularniejszych rodzajów baz danych między innymi należą:

  • bazy relacyjne (np. MySQL),
  • bazy nierelacyjne (np. MongoDB, Oracle NoSQL database).
MongoDB

NoSQL vs SQL

 

Poznaj możliwości, jakie daje MongoDB w ecommerce!

Przeczytaj artykuł

Czym w ogóle jest SQL?

SQL to nic innego jak język, jednakże jego przeznaczenie jest zgoła inne niż języków typu Java czy C#. SQL służy do konkretnych czynności, jakimi są dostęp do danych oraz ich modyfikacja. Będąc bardziej dokładnym, SQL oznacza Structured Query Language. Jest to język zapytań, który pozwala na pobranie określonych danych z bazy – w tym celu został stworzony: do uzyskania dostępu, przechowywania i edycji danych w relacyjnych bazach danych.

Czym jest relacyjna baza danych?

Relacyjną bazą danych jest rodzaj bazy, która przeważnie jest zbudowana z tabel. Pozwala to na dostęp do danych w relacji, które są częścią innych danych (tabeli) w tej samej bazie danych. Innymi słowy, przechowuje dane w wielu tabelach, które są ustrukturyzowane w kolumny i wiersze. Dzięki temu można wysyłać zapytania o dane z różnych tabel jednocześnie.

Relacyjna baza danych opiera się na modelu relacyjnym, a do zarządzania tym typem bazy używa się RDBMS (Relational Database Management System). Aby RDBMS mógł współpracować z wieloma rodzajami baz danych, do zarządzania i tworzenia zapytań używa się SQL, który jest w tym przypadku najpopularniejszym językiem.

Jak działają relacyjne bazy danych SQL?

Relacyjne bazy danych są oparte na modelu relacyjnym. W modelu relacyjnym dane są przyporządkowane do jednej lub wielu tabel (lub „relacji”) kolumn i wierszy, który przyporządkowuje dane do jednej lub wielu tabel (lub „relacji”) kolumn i wierszy. Każdy wiersz w tabeli posiada unikalny identyfikator, po którym jest kojarzony. Z kolei każda tabela bazy danych przedstawia pewien rodzaj encji (przykładem encji może być „klient”). Wiersze tabeli przedstawiają konkretną instancję tej encji (np. klient – Jan Kowalski), a kolumny, zwane też atrybutami, przedstawiają szczegóły danego obiektu (np. imię, adres). Same relacje to nic innego jak dopasowanie danych w różnych tabelach na podstawie kluczy głównych i kluczy obcych.

Typy relacji

Główne typy relacji to:

1:1

Relacja jeden do jednego pomiędzy dwoma tabelami. Zachodzi ona wtedy, gdy każdy rekord z pierwszej tabeli ma przyporządkowany dokładnie jeden rekord z drugiej tabeli i na odwrót. Aby zdefiniować relację jeden do jednego, należy w drugiej tabeli umieścić wartość klucza podstawowego z pierwszej tabeli.

1:W

Relacja jeden do wielu również zachodzi pomiędzy dwoma tabelami. Występuje wtedy, gdy pojedynczy rekord z pierwszej tabeli posiada przyporządkowany jeden lub wiele rekordów z drugiej tabeli. Jednak druga tabela ma przyporządkowany jedynie jeden rekord z pierwszej tabeli.

W:W

Relacja wiele do wielu – taka relacja też zachodzi między dwoma tabelami. Pojedynczy rekord z pierwszej tabeli ma przyporządkowany jeden lub wiele rekordów z drugiej tabeli i na odwrót. W relacji wiele do wielu często tworzy się trzecią tabelę.

Jak działają nierelacyjne bazy danych NoSQL?

Nierelacyjne bazy danych są również nazywane bazami NoSQL. Nazwa pochodzi właśnie od podejścia do przechowywania i wyszukiwania danych w inny sposób niż w relacyjnych bazach danych opartych na SQL. Warto mieć na uwadze, że niektóre bazy nierelacyjne wspierają język SQL.

Bazy NoSQL charakteryzują się tym, że są w stanie obsłużyć dużą ilość nieustrukturyzowanych danych. Rozwiązania NoSQL nie są niczym nowym, jednak dopiero od kilkunastu lat gwałtownie zyskują na popularności właśnie ze względu na możliwości obsłużenia wielu danych, np. z urządzeń mobilnych, IoT czy Big Data.

Nierelacyjne bazy danych vs relacyjne bazy danych

Struktura:

  • Bazy danych SQL przechowują dane w tabelach o stałej liczbie wierszy i kolumn.
  • Bazy NoSQL przechowują dane w następujący sposób:

Schemat / Diagram

  • Bazy SQL wymagają stałego, wcześniej zdefiniowanego schematu. Wszystkie dane muszą mieć taką samą lub podobną strukturę. Przez to często przed rozpoczęciem prac trzeba mieć zebrane wstępne wymagania odnośnie do systemu. Ponadto elastyczność bazy może być narażona, biorąc pod uwagę, że modyfikacje (migracje) struktury mogą być skomplikowane i złożone.
  • Bazy NoSQL posiadają dynamiczny schemat dla danych nieustrukturyzowanych. Stała definicja schematu nie jest wymagana, przez co wprowadzenie zmian w strukturze jest łatwiejsze.

Skalowalność

  • Bazy SQL skalują się wertykalnie, pionowo (tzw. scale-up). Oznacza to, że jeśli chcemy zwiększyć ilość przechowywanych danych na pojedynczym serwerze, trzeba zwiększyć pamięć RAM, wydajność procesora lub pojemność dysku SSD. Skalowanie baz relacyjnych jest raczej trudniejsze. Żeby w wieloserwerowej bazie SQL zachować integralność danych w transakcjach, potrzebny jest backend pozwalający synchronizować wszystkie operacje zapisu i transakcje w celu uniknięcia zjawiska deadlocka (czyli zakleszczenia, wzajemnej blokady akcji).
  • Bazy NoSQL skalują się horyzontalnie, poziomo (scale-out). Oznacza to, że skalowanie odbywa się przez zwiększenie liczby serwerów. Operacje JOIN pozwalają na łączenie i powiązanie części danych. Ogólnie rzecz biorąc, bazy danych NoSQL nie są zaprojektowane do wydajnej obsługi operacji typu JOIN, ale dają taką możliwość. Dane mogą znajdować się na różnych serwerach w bazach NoSQL, gdzie łączenie tabel z wielu serwerów może być kłopotliwe. NoSQL umożliwia łatwe skalowanie poprzez sharding danych. Posiadanie warstwy routingu pozwala przekierować zapytanie do odpowiedniego shardu, dzięki czemu bazy danych NoSQL są wysoce skalowalne i umożliwiają szybką obsługę zapytań.

Zapytania

  • Język SQL istnieje od ponad 30 lat, dlatego jest powszechnie używany, popularny i cieszy się dobrą opinią. Jest niezwykle wydajny, jeśli chodzi o zapytania, operacje i pobieranie danych z relacyjnych baz danych. Dodatkowo wyróżnia się również deklaratywnością (to znaczy, że pozwala opisać to, co ma być z jego pomocą wykonane). Zaletą SQL jest to, że całkiem łatwo można się go nauczyć. Oznacza to, że analitycy biznesowi czy inni pracownicy niezwiązani z programowaniem mogą z niego korzystać bez większych problemów.
  • Jeżeli chodzi o zapytania NoSQL, może to nie być tak proste jak przy użyciu SQL w bazach relacyjnych, ponieważ zwykle wymaga dodatkowego przetwarzania danych i nie ma jednego deklaratywnego języka zapytań. Dlatego zadania z wykorzystaniem NoSQL są zwykle wykonywane przez programistów.

Podsumowując, sposób uruchamiania zapytań w bazach NoSQL w dużej mierze zależy od bazy. Na przykład w MongoDB, aby zażądać danych z bazy dokumentów JSON, należy określić dokumenty z właściwościami, do których wyniki powinny być dopasowane, i zastosować następującą funkcję: db.collection.find()

Inne popularne rozwiązania mogą obejmować tworzenie funkcjonalności wysyłania zapytań bezpośrednio w warstwie aplikacji (a nie w warstwie bazy danych) lub implementację MapReduce, platformy ułatwiającej przetwarzanie dużych zbiorów danych.

Kiedy wybrać NoSQL, a kiedy SQL

Teraz, gdy już znamy główne różnice pomiędzy SQL i NoSQL, spróbujmy odpowiedzieć na pytanie: kiedy wykorzystać relacyjne bazy danych, a kiedy nierelacyjne? Jak to często bywa w IT – decyzja zależy od wielu składowych. W tym wypadku główne kwestie do rozważenia to:

  1. Rodzaj danych
  2. Sposób zarządzania bazą danych
  3. Ilość danych
NoSQL vs SQL, czyli kiedy i jaki typ bazy danych wybraćNoSQL vs SQL, czyli kiedy i jaki typ bazy danych wybrać

Kiedy wybrać SQL?

Odnosząc się do pierwszej składowej, rodzaju danych – w tym wypadku bazy relacyjne sprawdzą się lepiej niż bazy NoSQL, jeżeli spójność i integralność danych jest kluczowa.

Powszechne jest przekonanie, że relacyjne bazy danych nie są dobrym wyborem do obsługi dużej ilości danych. To stwierdzenie jest nie do końca prawdziwe. Wiele baz danych typu MySQL czy PostgreSQL radzi sobie bardzo dobrze z dużą ilością danych. Bazy relacyjne posiadają stały, ustalony schemat i wymagają danych, które są ustrukturyzowane. Utrzymanie takiej struktury, spójności i wydajności może się okazać bardzo trudne, jeśli z pomocą bazy relacyjnej będziemy obsługiwać biznes związany z Big Data.

Na pierwszy rzut oka mogłoby się wydawać, że stała struktura może być ograniczająca, jednak nie ma tu reguły. Posiadanie stałej, odgórnie zdefiniowanej struktury sprawia, że bazy SQL są lepszą opcją do obsługi systemów płatniczych czy też systemów rezerwacji. Ciekawostką jest, że większość instytucji finansowych opiera się właśnie na relacyjnych bazach danych. Relacyjne bazy zapewniają transakcyjność, czyli integralność danych i ich prawidłowość. SQL może czasami ograniczać pewne funkcjonalności, ale z drugiej strony jest bardzo dojrzałą i sprawdzoną technologią.

Kiedy wybrać NoSQL?

Bazy NoSQL są w stanie przechowywać różne rodzaje danych i nie muszą być one żaden sposób ustrukturyzowane. Dlatego nierelacyjne bazy danych zapewniają większą elastyczność i są dobrym wyborem do obsługi dużej ilości danych bez wspólnej struktury.

Przeważnie im bardziej rozbudowany jest zbiór danych, tym większe prawdopodobieństwo, że baza NoSQL będzie lepszym wyborem. Bazy nierelacyjne mają dobre predyspozycje względem skalowalności i dostępności, przez co jest to idealne rozwiązanie dla aplikacji, które działają w czasie rzeczywistym (np. gry hazardowe online, komunikatory).

Jaką bazę danych zatem wybrać?

Żeby odpowiedzieć na to pytanie, należy najpierw zrozumieć domenę. Jaki efekt próbuje się osiągnąć? W obecnych czasach często wybór między SQL i NoSQL nie jest kwestią tego, której bazy użyć, tylko tego, kiedy i gdzie używać każdej z tych baz w ramach tej samej aplikacji czy systemu.

Osobiście pracuję nad aplikacją, w której użycie bazy NoSQL było – nie zagłębiając się w szczegóły – najbardziej sensowne, jednak ta sama aplikacja wymagała też raportów. Żeby uniknąć nadmiernych problemów i analiz, uznałem, że wykorzystam oba typy baz danych. Użyłem NoSQL dla aplikacji internetowej i desktopowej oraz SQL dla samych raportów. Informacje są przechowywane w bazie NoSQL, a tylko dane wymagane do raportów są przesyłane do bazy SQL.

Baza NoSQL i SQL – porównanie

NoSQL vs SQL, czyli kiedy i jaki typ bazy danych wybraćNoSQL vs SQL, czyli kiedy i jaki typ bazy danych wybrać

Podsumowanie

Wybór odpowiedniej bazy danych nie jest łatwy, nawet dla ekspertów, a podjęcie decyzji, czy wybrać relacyjne, czy nierelacyjne bazy może zależeć od wielu czynników. Należy również wziąć pod uwagę, jak wiele opcji jest dostępnych na rynku w zakresie baz SQL i NoSQL. Na przykład, w przypadku dużej ilości nieustrukturyzowanych danych dobrym rozwiązaniem mogą być bazy CouchDB lub MongoDB. Jednak w przypadku, gdy priorytetem będzie wysoka dostępność, lepszym wyborem mogą okazać się Redis i Cassandra.

Z drugiej strony bazy danych SQL oferują wiele korzyści w zakresie transakcji na danych i ich ogólnej integralności. Co więcej, relacje w nich można łatwo zidentyfikować i zdefiniować, co ułatwia wyciąganie wniosków z krytycznych spostrzeżeń.

Autorem wpisu jest:

.NET Developer

Programista z krwi i kości, lubiący różne wyzwania związane z R&D i Proof of Concept, z zachowaniem podejść DDD i SOLID.
Zafascynowany architekturą mikroserwisową i dekompozycją. Prywatnie fan motoryzacji, wyścigów i Track Days.

Dodaj komentarz: