Na ovom portalu već je objavljeno nekoliko tekstova o razlikama između relacijskog i drugih modela baza podataka. U njima su detaljno prikazane prednosti i nedostaci svakog od modela te načini na koji proizvođači pojedinih baza podataka pokušavaju zaobići nedostatke modela podržanog u vlastitom proizvodu.
U ovom tekstu prikazat ćemo jedan relativno nov proizvod (postoji tek nekoliko godina) koji je otpočetka dizajniran tako da pokuša povezati dobre strane oba modela. Riječ je o proizvodu pod nazivom FaunaDB. Idejna osnova za razvoj bio je projekt Calvin (Sveučilište Yale u razdoblju od 2012. do 2015. godine). Cjelokupna dokumentacija o projektu Calvin javno je dostupna na ovoj adresi, kao i izvorni kod.
Na temelju spomenutog projekta idejni začetnici Evan Weaver (bivši arhitekt i direktor infrastrukture u Twitteru), Matt Freels (tehnički voditelj timova zaduženih za baze podataka u Twitteru) te Chris Anderson (suosnivač poduzeća Couchbase) upravljali su razvojem nove baze podataka pod nazivom FaunaDB. Iako je FaundaDB po svojim obilježjima u osnovi noSQL model baze podataka, sadrži i neke mogućnosti preuzete iz relacijskih baza podataka.
Slika 1. Registracija novog korisnika FauneDB ili prijava postojećeg korisnika
Početna web-adresa za pristup bazi je, naravno, https://fauna.com/. Na njoj se odmah može napraviti registracija korisnika za naknadni pristup bazi ili prijava već registriranog korisnika. Jedna od zanimljivosti baze FauneDB je to da su praktično sve mogućnosti potrebne za upoznavanje sustava i korištenje dostupne preko web-sučelja i to besplatno. Na temelju besplatne verzije baze može se razviti cijeli IT sustav u nekom od podržanih jezika (Python, C#, Go, Swift, Java, Scala...), a na komercijalno korištenje može se prijeći tek kad zahtijevani resursi u pogledu veličine baze ili prometa podataka premaše ograničenja besplatne verzije.
Preko web-sučelja mogu se izravno izvesti praktično sve operacije nad bazom podataka – od pripreme nove baze podataka do izvođenja osnovnih CRUD (Create, Read, Update i Delete) naredbi nad podacima. Sve najvažnije operacije nad bazom podataka, kolekcijama i samim dokumentima u kolekcijama tijekom faze učenja prikazane su u online vodičima dostupnim izravno u okviru korisničkog sučelja. Kod pripreme nove baze podataka moguće je u nju automatski uključiti i demo podatke. Na taj način se odmah može vidjeti kako izgleda implementacija stvarnih kolekcija podataka u FauniDB.
Slika 2. Kod pripreme nove baze podataka mogu se odmah uključiti i demo podaci (customers, orders...)
Budući da FaunaDB nije relacijska baza podataka, za pristup podacima nije se moguće koristiti standardnim jezikom upita SQL. Umjesto toga mogu se koristiti čak dva različita jezika upita. To su Fauna Query Language (FQL) i GraphQL. Osnovna ideja iza podrške za dva različita jezika upita je to da se u sustav uz „prirodni“ FQL jezik uključi i GraphQL, što bi trebalo olakšati korištenje bazom programerima koji već dobro poznaju GraphQL. Zbog toga ćemo se u nastavku teksta, prije svega, pozabaviti „prirodnim“ jezikom, a to je FQL.
U slučaju da se do sada niste koristili ni GraphQL-om, više informacija o njemu možete pronaći u predavanju autora ovog teksta.
Slika 3. Primjer pripreme vlastite kolekcije podataka
Svaki FQL upit šalje se na obradu klaster sustavu za upravljanje bazom podataka, koji ih obrađuje pa nakon toga vraća rezultate. Pri tome svaki upit uvijek predstavlja zaokruženu transakciju, što znači da ne može biti izveden djelomično. Garantira se izvođenje cjelokupnog upita, ili sustav vraća grešku koja pokazuje zašto nije bilo moguće njegovo izvođenje.
Slijedi primjer pripreme baze podataka, kolekcije i indeksa na kolekciju pomoću jezika FQL. Podaci ne moraju biti unaprijed strukturirani kao kod relacijskog modela, pa ne postoji ni potreba za početnim definiranjem detaljnih karakteristika objekata u bazi kako bi se njima kasnije mogli koristiti za spremanje podataka (dobro poznate tablice u relacijskom modelu).
CreateDatabase({name: "employees"})
CreateCollection({name: "dept"});
CreateIndex({
name: "dept_by_deptno",
source: Collection("dept"),
terms: [{ field: [ "data", "deptno" ] }],
unique: true
})
Čitanje podataka iz baze podataka u jeziku FQL
Map(
Paginate(
Match(Index("dept_by_deptno"), 10)
),
Lambda("X", Get(Var("X")))
)
Slika 4. Primjer izvođenja FQL upita
Dodavanje, ažuriranje i brisanje podataka u jeziku FQL:
Create(
Collection("dept"),
{
data: {
"deptno": 10,
"dname": "ACCOUNTING",
"loc": "NEW YORK"
}
}
)
Update(
Select("ref",
Get(
Match(Index("dept_by_deptno"), 10)
)
),
{
data: { loc: "AUSTIN" }
}
)
Delete(
Select(
"ref",
Get(
Match(Index("dept_by_deptno"), 10)
)
)
)
Ako vam je kao poznavatelju GraphQL tehnologije jednostavniji takav način komunikacije s bazom podataka, na sljedećoj slici nalazi se primjer kako bi izgledao upit u GraphQL tehnologiji.
Slika 5. Primjer izvođenja GraphQL upita
Spomenimo još nekoliko bitnih karakteristika FauneDB na kraju teksta.
Podaci se spremaju u bazu FaunaDB u obliku polustrukturiranih dokumenata, što može uključivati i rekurzivno ugnježđivanje drugih objekata, polja vrijednosti ili pojedinačnih podataka. Čak postoji mogućnost da jedna baza podataka rekurzivno sadržava druge baze podataka. Nešto slično odnosu mapa i podmapa u datotečnom sustavu računala.
Pristup bazama podataka kontrolira se pomoću ključeva, što uključuje pristup točno određenim resursima u bazi podataka, nadzor nad prioritetima kod izvođenja različitih operacija, upravljanje transakcijama, zadavanje potrebnih resursa za rad i ostalo.
Indeksi, kao i kod relacijskog modela, ubrzavaju pristup podacima u bazi, ali su istovremeno zaduženi za još neke stvari. Budući da indeksi u bazi FaunaDB predstavljaju djelomično primijenjene upite nad podacima, time zamjenjuju dobro poznate poglede iz relacijskog modela. Indeksi se također mogu iskoristiti za postavljanje ograničenja na vrijednosti spremljenim u bazi te za međusobne veze među podacima.
FQL upiti mogu biti parametrizirani, što znači da prije izvođenja zahtijevaju navođenje vrijednosti svih potrebnih parametara. Tako postaju nešto slično pohranjenim procedurama u relacijskom modelu. FaunaDB omogućava i relativno jednostavno dodavanje vlastitih funkcija i drugih proširenja, što olakšava podršku za rukovanje s geografski orijentiranim podacima, pretraživanje cjelokupnih tekstova spremljenih u bazu i druge stvari koje nedostaju u njezinom osnovnom modelu.
Jedna od prilično originalnih i vrlo bitnih mogućnosti baze FaunaDB je svojevrsna „privremenost“ svih podataka spremljenih u bazu. Kod izmjene nekog podatka u bazi njegova prethodna vrijednost ne prepisuje se novim podacima, nego se u bazu uvijek dodaju novi podaci koji automatski postaju aktivni podaci. Kod izvođenja upita za čitanje podataka iz baze podataka može se zahtijevati pristup nekoj od prethodnih vrijednosti podataka, a ne samo zadnjim podacima. To bitno pojednostavljuje izgradnju sustava gdje je potrebno čuvati povijesne vrijednosti podataka. Uz odgovarajuću razinu prava povijesni podaci se po potrebi ipak mogu mijenjati ili brisati. Na primjer, zbog razloga povezanih s GDPR direktivom ili zbog smanjivanja ukupne veličine baze podataka.
U distribuiranom okruženju korištenje bazom FaunaDB ne dovodi do bitnog pada performansi sustava kod porasta veličine baze ili povećanja broja servera. Svaki čvor (node) u klasteru FaunaDB služi kao koordinator za izvođenje upita, ali istovremeno upravlja spremanjem replika podataka i bilješki o radu (automatski postupak). Jedna od posljedica takve implementacije čvorova je bitno povećanje brzine izvođenja transakcija.
Dodatne karakteristike baze koje povoljno utječu na brzinu izvođenja upita su:
- lokalne strukture indeksa čuvaju se u radnoj memoriji što ubrzava korištenje u odnosu na pristup na disku
- kod spremanja podataka na diskove koristi se LZ4 algoritmima što također smanjuje utjecaj brzine diskova na rad sustava
- operacije sažimanja baze izvode se automatski i asinkrono kako bi se uklonili zaostali i nepotrebni podaci kad za to postoji prilika.
Na temelju svega navedenog, FaunaDB predstavlja zanimljivu novost na području baza podataka, a vrijeme će pokazati koliko će se njome zaista koristiti u praksi.