Jaka baza danych do projektu: MySQL, PostgreSQL, SQLite czy może NoSQL?

Jaką bazę danych wybrać?

Podczas fazy planowania projektu programistycznego w pewnym momencie stajemy przed wyborem bazy danych, z której korzystać będzie nasza aplikacja. Znaleźć można wiele darmowych rozwiązań takich jak MySQL, PostgreSQL, MS SQL Server, SQLite czy też zdobywające coraz większą popularność bazy danych typu NoSQL. Która z nich jest najlepsza i dlaczego?

Jak w przypadku większości technologicznych wyborów nie da się tutaj jednoznacznie wskazać, które rozwiązanie jest tym lepszym. Postaram się przybliżyć Wam najpopularniejsze rozwiązania bazodanowe wskazując ich mocne i słabe strony, aby ułatwić Wam wybór właściwej bazy do projektu.

Chciałbym skupić się tutaj przede wszystkim na silnikach MySQL, SQLite i PostgreSQL oraz bazach NoSQL, gdyż z nimi miałem najwięcej wspólnego. Na przykładzie tych baz najłatwiej również pokazać różnice pomiędzy poszczególnymi rozwiązaniami.

MySQL

Jest to zdecydowanie najpopularniejszy silnik bazodanowy rozwijany jako open source. Rozwojem MySQL zajmuje się obecnie firma Oracle. Na czym polega fenomen tego silnika oraz skąd wzięła się jego popularność?

Przez wiele lat najpopularniejszym językiem wykorzystywanym przy tworzeniu aplikacji webowych był PHP, dla którego domyślną bazą danych jest właśnie MySQL. Czynnikiem, który również miał wpływ na szybki rozwój oraz uwielbienie różnych społeczności programistyczych, był również bezproblemowy proces instalacji i łatwość korzystania z omawianego rozwiązania.
Prawdopodobnie największymi zaletami MySQL są jednak skalowalność i szybkość. Z rozwiązania tego korzystają giganty technologicze jak na przykład YouTube, Spotify, Facebook, Twitter czy NASA. Co prawda nie jest to technologia występująca natywnie w chmurze, jednak na korzystanie z tej bazy jako rozwiązania chmurowego pozwala usługa DBaaS (Database-as-a-service) Cloud SQL oferowana przez Google.

Consistency

Bazy danych działające na silniku MySQL zapewniają Immediate Consistency. Na czym to polega? Gdy korzystamy z replik bazy danych silnik bazodanowy musi obsłużyć żądanie zapisu danych tak, aby nowe dane dotarły do każdej repliki. Może się zdarzyć, że w trakcie aktualizowania danych w bazie wysłane zostanie kolejne żądanie, tym razem dostępu do danych.
W takiej sytuacji silnik bazodanowy może najpierw poczekać, aż wszystkie repliki będą aktualne, a dopiero później udostępnić dane zapewniając ich aktualność. Taka strategia nosi nazwę Immediate/Strong Consistency.
Inną stosowaną strategią jest Eventual Consistency. W tym przypadku baza odpowie na żądanie dostarczenia danych od razu zmniejszając opóźnienie do minimum, ryzkując, że dane mogą być nieaktualne.

Wybierając bazę danych warto zwrócić uwagę również na dodatkowe narzędzia powiązane z danym silnikiem. Dzięki ogromnej społeczności fanów tego rozwiązania, MySQL posiada mnóstwo narzędzi stworzonych przez różne grupy programistycznych wolontariuszy. Część z nich trzeba pobrać oddzielnie, jednak znajdziemy też kilka wbudowanych narzędzi, na przykład pozwalających na korzystanie z interfejsów graficznych. MySQL posiada również funkcje zwiększające bezpieczeństwo naszych baz danych.

Cechą MySQL, którą wielu uważa za wadę, jest brak implementacji pełnego standardu SQL. Silnik rozwijany przez firmę Oracle nie radzi sobie najlepiej z operacji wykonywanymi równolegle. Mimo sporej liczby typów danych i funkcji bazy, w przypadku niektórych projektów mogą być one niewystarczające. W takich sytuacjach do gry wchodzi PostgreSQL.

PostgreSQL

Omawiany silnik bazodanowy jest dużo bardziej zaawansowanym rozwiązaniem niż opisany wcześniej MySQL. Co za tym idzie, mniejsza jest również jego popularność, jednak ze względu na ogromne możliwości, technologia ta znajduje również ogromną rzeszę fanów, którzy napędzają jej rozwój tworząc dodatkowe narzędzia i biblioteki. Jest to rozwiązanie typu open source. Twórcy bazy zdecydowali się na implementacje pełnego standardu ANSI/ISO SQL.

Ogromną zaletą PostgreSQL w porównaniu z innymi rozwiązaniami jest jej „rozszerzalność”. Pozwala ona na tworzenie własnych typów danych czy też dodatkowych funkcji, do pisania których można wykorzystywać składnie innych języków niż SQL.
programming lanuages mix

Porównując omawianą bazę danych do innych cechą szczególnie rzucającą się w oczy jest liczba zdefiniowanych typów danych, jakie możemy przechowywać w bazie. Oprócz podstawowych typów danych, jakie znajdziemy w każdym innym rozwiązaniu bazodanowym w bazach PostgreSQL przechowywać możemy tablice, dokumenty JSON lub XML czy nawet figury geometryczne jak na przykład odcinek lub okrąg. Jeżeli dodamy do tego już wcześniej wspomnianą możliwość tworzenia własnych typów, możliwości stają się niemal nieograniczone.

PostgreSQL świetnie radzi sobie z operacjami równoległymi. W przypadku wielu aplikacji właśnie ta właściwość omawianej bazy jest najbardziej doceniana. Omawiany system posiada również wiele mechanizmów bezpieczeństwa danych.
Inną ważną funkcją Postgres’a, o której chciałbym wspomnieć jest wyszukiwanie tekstu (Full Text Search). W każdym rozwiązaniu bazodanowym znajdziemy funkcję typu LIKE, która pozwala na wyszukiwanie wzorców tekstowych, jednak omawiana baza postawiła na poprawienie tego mechanizmu. Indeksowanie tekstu oraz implementacja funkcji lingwistycznych pozwalają na szybsze i dokładniejsze wyszukiwanie tekstu, szczególnie dobrze sprawdzające się w przypadku języka angielskiego.

Oczywiście nie jest to rozwiązanie idealne dla każdej aplikacji. Mnogość dostępnych funkcji w przypadku mniejszych aplikacji może niepotrzebnie skomplikować, a nawet spowonlić wiele procesów, szczególnie tych wymagających szybkiego odczytu danych.

Coraz częściej znaleźć można programistyczne ogłoszenia o pracę, w których wymagana jest znajomość PostgreSQL, co jest kolejnym powodem na zainteresowania się tym rozwiązaniem :)

SQLite

SQLite jest jednym z prostszych rozwiązań bazodanowych. Jest to system oparty na plikach – każda tworzona baza zapisywana jest w katalogu aplikacji jako plik z rozszerzeniem .db, w którym przechowywane są dane. Zapewnia to aplikacjom szybkość korzystania z bazy (zależną od szybkości odczytu/zapisu na dysku) oraz łatwość przenoszenia bazy.

SQLite posiada podstawowe typy danych, które w wielu przypadkach będą wystarczające. Jest to więc idealna baza danych do wykorzystywania na początku tworzenia aplikacji jak i przy testowaniu. Biblioteka pozwalająca na korzystanie z SQLite wbudowana w Pythona pozwala na tworzenie bazy danych w pamięci RAM, co znacząco zwiększa szybkość operacji i uprzyjemnia proces testowania ;)
Idealnie sprawdza się również w przypadku aplikacji niewymagających obsługi wielu użytkowników, jak na przykład prostych aplikacji mobilnych czy desktopowych.

Bazy danych NoSQL

NoSQL cv
Nazwa NoSQL odnosi się do grupy nierelacyjnych baz danych, na którą składa się kilka rodzajów baz:

  • Key-value – najprostszy typ bazy NoSQL, sposób przechowywania danych przypomina programistyczny słownik/mapę. Jedną z tego typu baz jest Redis
  • Document – typ bazy danych pozwalających na przechowywanie dokumentów takich jak na przykład JSON czy XML. Bazę tego typu oferuje między innymi MongoDB
  • Graph – baza oparta na grafach, która skupia się na połączeniach między obiektami. Bazy tego typu wykorzystywane są często w aplikacjach społecznościowych, gdyż idealnie sprawdzają się do przechowywania polubień, subskrypcji czy znajomości między użytkownikami. Przykład bazy tego typu to Neo4j
  • Wide-column – w przypadku tej bazy danych nazwy i typy kolumn mogą różnić się dla różnych wierszy. Bazy tego typu dobrze sprawdzają się w aplikacjach opartych na dużej liczbie skomplikowanych kwerend, a nie ogromnej ilości danych. Przykładem takiej bazy jest Apache Cassandra

Bazy danych NoSQL są idealnym wyborem do aplikacji korzystających z ogromnych ilości nieustrukturyzowanych, lub częściowo ustrukturyzowanych danych, które ulegają gwałtownym zmianom. W przypadku takich danych korzystanie z relacyjnych baz sprawiałoby problem w momencie, w którym chcielibyśmy zmienić typ jakiejś kolumny. Nierelacyjne bazy danych zyskują na popularności również dzięki bardzo dobremu skalowaniu.
Wśród baz nierelacyjnych znajdziemy zarówno produkty zapewniające strong consistency (np. MongoDB) jak i eventual consistency (np. Cassandra).

Podsumowanie

Najbardziej uniwersalnym rozwiązaniem jest MySQL oraz inne podobne do niej bazy. Jej szybkość, skalowalność i zgromadzona wokół niej społeczność sprawiają, że baza ta znajdzie zastosowanie w większości aplikacji.

W momencie gdy funkcje oferowane przez wyżej wymienioną bazę stają się niewystarczające, jest to dobry moment na sięgnięcie po PostgreSQL.
Wykorzystywanie tej bazy w małych aplikcjach, gdzie nie wykorzystujemy zaawansowanych funkcji jak na przykład złożonych typów danych czy funkcji, może spowodować niepotrzebne problemy i spowolnić działanie aplikacji.

SQLite jest rozwiązaniem, które zdecydowanie polecam do testowania aplikacji.

Wybierając bazę danych zachęcam również do zastanowienia się nad rozwiązaniem typu NoSQL, gdyż bazy te ostanimi czasy zyskują ogromną popularność.

Źródła:




2 komentarze

  1. Opisałeś poszczególne silniki baz danych, podałeś ich charakterystykę, ale w artykule brakuje mi treści związanej z tym jak wybierać konkretny silnik do konkretnego problemu. Artykuł nie wnosi nic związanego z Twoim doświadczeniem bądź praktykami na podstawie wykonanych projektów.

    1. Cześć Mat,
      Przede wszystkim dzięki za feedback!
      W tym poście chciałem podejść do tematu ogólnie, zwrócić uwagę na wybrane dostępne rozwiązania i zachęcić do wgłębienia się w temat ;)
      Czy byłbyś bardziej zainteresowany artykułami typu case study na temat wykorzystania poszczególnych baz w konkretnych projektach z wypunktowaniem zalet i wad wyboru bazy? Zależy mi aby tematy, których się podejmuje, były interesujące dla czytelników, dlatego każda sugestia jest tutaj mile widziana.
      Pozdrawiam! ;)

Leave a Reply

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *