Nie chodzi o NoSQL kontra SQL, chodzi o BASE vs ACID.
Skalowalny musi zostać rozbity na składniki:
- Skalowanie odczytu = obsługa większej liczby operacji odczytu
- Skalowanie zapisu = obsługa większej liczby operacji zapisu
Bazy danych zgodne z ACID (takie jak tradycyjne RDBMS) mogą skalować odczyty. Nie są one z natury mniej wydajne niż bazy danych NoSQL, ponieważ (możliwe) wąskie gardła wydajności są wprowadzane przez rzeczy, których NoSQL (czasami) brakuje (jak sprzężenia i ograniczenia), których nie można użyć. Klastrowy SQL RDBMS może skalować odczyty, wprowadzając dodatkowe węzły w klastrze. Istnieją ograniczenia co do skalowania operacji odczytu, ale są one narzucone przez trudność skalowania zapisu podczas wprowadzania większej liczby węzłów do klastra.
Skalowanie zapisu jest miejscem, w którym rzeczy stają się owłosione. Istnieją różne ograniczenia nałożone przez zasadę ACID, których nie widać w ostatecznie spójnych architekturach (BASE):
- Atomowość oznacza, że transakcje muszą zostać sfinalizowane lub zakończyć się niepowodzeniem jako całość, dlatego należy dużo zaksięgować, aby to zagwarantować.
- Ograniczenia spójności oznaczają, że wszystkie węzły w klastrze muszą być identyczne. Jeśli piszesz do jednego węzła, ten zapis musi zostać skopiowany do wszystkich innych węzłów przed zwróceniem odpowiedzi do klienta. To sprawia, że tradycyjny klaster RDBMS jest trudny do skalowania.
- Ograniczenia dotyczące trwałości oznaczają, że aby nigdy nie utracić zapisu, należy upewnić się, że przed zwróceniem odpowiedzi klientowi zapis został wypłukany na dysk.
Aby skalować operacje zapisu lub liczbę węzłów w klastrze poza pewien punkt, musisz być w stanie rozluźnić niektóre wymagania ACID:
- Upuszczenie Atomowości pozwala skrócić czas, przez który tabele (zestawy danych) są zablokowane. Przykład: MongoDB, CouchDB.
- Porzucenie spójności pozwala skalować zapisy między węzłami klastra. Przykłady: riak, cassandra.
- Upuszczanie Trwałość pozwala reagować na polecenia zapisu bez opróżniania dysku. Przykłady: memcache, redis.
Bazy danych NoSQL zwykle stosują model BASE zamiast modelu ACID. Porzucają wymagania A, C i / lub D, aw zamian poprawiają skalowalność. Niektóre, takie jak Cassandra, pozwalają ci korzystać z gwarancji ACID, kiedy ich potrzebujesz. Jednak nie wszystkie bazy danych NoSQL są przez cały czas bardziej skalowalne.
SQL API nie ma mechanizmu opisywania zapytań, w których wymagania ACID są złagodzone. Dlatego wszystkie bazy danych BASE są NoSQL.
Osobista uwaga: ostatnią kwestią, którą chciałbym poruszyć, jest to, że w większości przypadków, gdy NoSQL jest obecnie używany do poprawy wydajności, możliwe byłoby rozwiązanie na właściwym RDBMS przy użyciu poprawnie znormalizowanego schematu z odpowiednimi indeksami. Jak udowodniła ta sama witryna (obsługiwana przez MS SQL Server), RDBMS może skalować się do dużych obciążeń, jeśli odpowiednio je wykorzystasz. Ludzie, którzy nie rozumieją, jak zoptymalizować RDBMS, powinni trzymać się z dala od NoSQL, ponieważ nie rozumieją, jakie ryzyko podejmują ze swoimi danymi.
Aktualizacja (17.09.2019):
Krajobraz baz danych ewoluował od opublikowania tej odpowiedzi. Chociaż wciąż istnieje dychotomia między światem ACID RDBMS a światem BASE NoSQL, linia stała się bardziej niewyraźna. Bazy danych NoSQL dodają funkcje ze świata RDBMS, takie jak SQL API i obsługa transakcji. Obecnie istnieją nawet bazy danych, które obiecują skalowanie SQL, ACID i zapisu, takie jak Google Cloud Spanner, YugabyteDB lub CockroachDB. Zazwyczaj diabeł tkwi w szczegółach, ale dla większości celów są one „wystarczająco KWASOWE”. Aby głębiej zapoznać się z technologią baz danych i jej ewolucją, możesz zapoznać się z tym pokładem slajdów (notatki ze slajdami mają dołączone wyjaśnienie).