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.