Baza dokumentowa

Baza NoSQL przechowująca dane jako dokumenty, najczęściej w formacie JSON. Pozwala na elastyczną strukturę bez sztywnego schematu, np. MongoDB.

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.