Na wstępnie przyznaję że tytuł specjalnie chwytliwy ;) Oczywiście zdaje sobie sprawę że relacyjne bazy danych mają swoje miejsce, tak jak wszystko w branży. Ale...
Niedługo minie 2 lata od kiedy założyłem wątek pytając o NoSQL. Wtedy mentalnie jeszcze byłem twardo w modelu relacyjnym- z czego zresztą zdawałem sobie sprawę i wspomniałem w tamtym wątku. Przez te 2 lata sporo się zmieniło i miałem dużo styczności z NoSQL- zarówno zawodowo jak i we własnych projektach hobbistycznych. Pomyślałem że podzielę się luźnymi przemyśleniami jak zmieniła się moja perspektywa jeśli chodzi o bazy SQL i NoSQL.
Znów będzie trochę kontrowersyjnie- dziś uważam że bazy SQL nie powinny być domyślnym wyborem. Piszę to przede wszystkim z perspektywy programisty a nie administratora systemu, chociaż i w tym drugim przypadku to wcale nie musi odbiegać od prawdy. Dla czego uważam że nie powinny? Dzięki NoSQL możemy skupiać się na modelowaniu domeny naszej aplikacji i nie przejmować (w granicach rozsądku) "kształtem" obiektów zapisywanych do bazy. Po prostu tworzymy lub aktualizujemy klasę, tworzymy instancję tej klasy i zapisujemy do bazy. Nie trzeba zajmować się tworzeniem skryptów SQL czy migracji jeśli używamy jakiegoś pełnoprawnego ORMa. Szybkość i wygoda rozwoju oprogramowania przy użyciu baz NoSQL jest zdecydowanie jednym z największych atutów tego rodzaju baz. Dodanie nowej właściwości/pola do obiektu to dosłownie kwestia dodania tego właśnie pola- nic więcej nie trzeba robić. Oczywiście można użyć argumentu że łatwo o wprowadzenie breaking changes, jednakże po tych 2 latach mojego obcowania z NoSQL mogę śmiało stwierdzić że jeśli utrzymuje się czysty kod i rozsądnie wprowadza przemyślane zmiany to bardzo łatwo zapobiec takim problemom.
Następnym argumentem jest prędkość i skalowalność- oczywiście tutaj można polemizować, ale ogólnie bazy NoSQL znane są właśnie z tego że jednym z ich głównych atutów jest prędkość oraz skalowalność. To oczywiście zazwyczaj przychodzi kosztem braku transakcyjności i integralności danych, chociaż i to nie jest takie oczywiste. Są bazy które od dawna wspierają transakcyjność (np. ACID przy zapisach i BASE przy odczytach), nawet na poziomie rozproszonym.
A skoro o integralności mowa- tu znów polecę kontrowersyjnie i stwierdzę że często to również nie ma znaczenia, i integralność referencyjna nie powinna być czymś domyślnie pożądanym. Często to właśnie aplikacja może poradzić sobie z takimi problemami. Np. możemy zapisać do bazy encję która posiada ID innej, nie istniejącej encji. Z braku integralności nie jesteśmy w stanie tego wykryć na etapie zapisu. Tylko czy jest to problemem? Otóż moim zdaniem nie. Takie rzeczy można obsłużyć w logice aplikacji bezpośrednio przed zapisem, lub później kiedy faktycznie ta nie istniejąca encja będzie nam potrzebna. To oczywiście zależy od natury konkretnej aplikacji i wymogów biznesowych, ale efekt koniec końców pozostanie ten sam- będziemy mieli błąd niezależnie od tego czy mamy integralność referencyjną czy też nie.
SQL pozwala również na budowanie i automatyczne optymalizowanie (do pewnego stopnia) skomplikowanych zapytań. Ale znów jest to raczej młotek gdzie wszystko inne wygląda jak gwóźdź- bardzo często lepsze efekty można osiągnąć stosując konkretną bazę NoSQL do konkretnego problemu, lub stosując poliglotyczne (nie wiem czy to dobre określenie) podejście gdzie baza SQL jest jedynie elementem, a nie głównym medium przechowywania i wyciągania danych.
Reasumując- od kiedy zacząłem przygodę z NoSQL to jeszcze nie zderzyłem się z przypadkiem gdzie potrzebowałbym bazy SQL. Dobrowolnie użyłem jej tylko raz do domowej aplikacji, i tylko dla tego że hosting na którym mam wystawioną stronę ma od razu w cenie bazę MSSQL. Zdaję sobię sprawę że są sytuacje kiedy faktycznie to baza SQL będzie potrzebna, ale jestem przekonany że są to raczej wyjątki niż norma a dzisiejsza popularność SQL bierze się z tego że jest to coś dobrze znanego, sprawdzonego, ustandaryzowanego i że przejście na NoSQL wiążę się z ze zmianą sposobu myślenia. Mimo wszystko moim zdaniem warto podjąć wyzwanie, bo bazy NoSQL niosą ze sobą wiele korzyści. Szczególnie takie korzyści które znacznie ułatwiają codzienną pracę.
Jak to wygląda u Was? Używacie/używaliście jakichkolwiek baz NoSQL? Rozważacie ich naukę albo wdrożenie u siebie w pracy?