Baza dokumentowa to rodzaj bazy NoSQL, w której podstawową jednostką danych nie jest wiersz w tabeli, lecz dokument — najczęściej obiekt w formacie JSON (albo jego binarnym wariancie, jak BSON w MongoDB). Każdy dokument trzyma komplet powiązanych danych w jednym miejscu, razem z zagnieżdżonymi strukturami i tablicami. Nie ma sztywnego schematu narzuconego z góry: dwa dokumenty w tej samej kolekcji mogą mieć różne pola i nikt się nie obrazi.
Najważniejsza różnica względem relacyjnej bazy jest taka, że nie rozbijasz danych na kilkanaście tabel i nie sklejasz ich potem JOIN-ami. Profil użytkownika wraz z adresami, zamówieniami i ustawieniami możesz zapisać jako jeden dokument i odczytać go jednym zapytaniem. Bazy dokumentowe grupują dokumenty w kolekcje (odpowiednik tabel), indeksują wybrane pola dla szybkiego wyszukiwania i dobrze skalują się poziomo przez sharding. Dlatego trafiają do katalogów produktów, systemów CMS, logów zdarzeń czy konfiguracji aplikacji — wszędzie tam, gdzie struktura danych bywa nieregularna lub szybko się zmienia.
Przykład z praktyki
Najpopularniejszym przedstawicielem jest MongoDB. Załóżmy, że masz kolekcję users. Dodajesz dokument tak:
db.users.insertOne({ name: "Ala", email: "[email protected]", roles: ["admin", "editor"], address: { city: "Warszawa" } })
A potem szukasz wszystkich adminów z Warszawy: db.users.find({ roles: "admin", "address.city": "Warszawa" }). Zwróć uwagę, że roles to tablica, a address to zagnieżdżony obiekt — w bazie relacyjnej potrzebowałbyś na to osobnych tabel i relacji. Innymi popularnymi silnikami dokumentowymi są CouchDB oraz Amazon DocumentDB.
Na co uważać
Najczęstszy mit brzmi: „brak schematu, więc nie muszę o nim myśleć”. Brak narzuconego schematu nie znaczy, że schematu nie ma — on po prostu wędruje z bazy do twojego kodu. Jak nie zadbasz o spójność pól, po roku skończysz z kolekcją, w której email, e-mail i mail oznaczają to samo, a żaden raport się nie spina.
- Bazy dokumentowe słabiej radzą sobie z transakcjami wieloobiektowymi i złożonymi relacjami między danymi — jeśli twój model to głównie powiązania many-to-many, relacyjna baza bywa lepsza.
- Duplikacja danych w wielu dokumentach upraszcza odczyt, ale komplikuje aktualizacje (zmieniasz coś w stu miejscach zamiast w jednym).
- NoSQL nie znaczy „bez reguł” — narzędzia takie jak walidacja schematu w MongoDB pozwalają wymusić strukturę tam, gdzie jej potrzebujesz.
Pojęcia powiązane: NoSQL, MongoDB, JSON, BSON, kolekcja, baza relacyjna (SQL), klucz-wartość, sharding, indeks, ACID.