NoSQL, tai toks duomenų bazės tipas, kuris apima įvairias technologijas, leidžiančias efektyviau tvarkyti vartotojo duomenis nei SQL DB tipu. Tačiau šis efektyvumas ne visada vienodai suprantamas ir jaučiamas vartotojui. Bendruoju atveju NoSQL duomenų bazės yra orientuotos į tokius projektus, kuriuose yra daug duomenų ir greitis dirbant su jais turi būti didelis. NoSQL atsisako sudėtingų sąryšių saugojimo tarp įrašų, taip pat duomenų schemos nėra fiksuotos, priešingai nei reliacinės duomenų bazės (SQL). SQL duomenų bazėje norint patalpinti duomenis, prieš tai turi būti aprašyta duomenų schema ir tik tada duomenys galės būti talpinami. NoSQL duomenų schemos yra dinamiškos [1]. Detalesnis SQL ir NoSQL palyginimas yra pateiktas lentelėje.
SQL ir NOSQL palyginimas
SQL
NOSQL
Tipai
Vieno tipo (SQL) duomenų bazės
Siūlo įvairius tipus, tokius kaip:,key-value– kiekvienas įrašas saugomas kaip,atributas kartu su savo reikšme.,document databases – saugomo įrašo reikšmė,yra dokumentas susidedantis iš atributų ir reikšmių rinkinio.,wide-column stores -,duomenys saugomi struktūrizuotai,,stulpeliais. Duomenų įrašas susideda iš dinamiškų stulpelių.,graph databases – šis tipas naudojamas saugoti,informacijai apie tinklą
Sukūrimo data
1970 metais
2000 metais SQL pasiekė tam tikrus limitus,,susijusius su praplečiamumu, nestruktūrizuotų duomenų saugojimu ir kt.
Pavyzdžiai, kas naudoja
MySQL, Postgres, Oracle Database
MongoDB, Cassandra, HBase, Neo4j
Duomenų modelis
Kiekvienas įrašas yra saugomas kaip eilutė lentoje,,kurio stulpelis saugo tam tikrą dalį įrašo
Įvairus, priklausomai nuo DB tipo
Duomenų schema
Struktūra ir duomenų tipai yra fiksuoti
Dinaminė schema
Plėtros modelis
Maišytas, tiek atviro kodo (pvz. MySQL),,tiek uždaro (pvz. Oracle Database)
Atviro kodo
Duomenų valdymas
Naudojant klasikines SQL užklausas
Naudojantis objektiniu programavimu,orientuota programavimo sąsaja
Greitaveika
Siekiant pamatytį gretaveikos skirtumus buvo atliekama rinkoje egzistuojančių NoSQL duomenų bazių lyginamoji analizė. Pasirinkti produktai, tai ArangoDB, MongoDB bei CouchDB. Remiantis ArangoDB kompanijos testavimais [2], yra pateiktas grafikas, kuris nurodo, kaip skirtingos duomenų bazės vykdo duomenų įrašymą (žr. žemiau pateiktą pav.). Į duomenų bazes yra įrašomi skirtingų dydžių duomenų rinkiniai. Pateiktoje diagramoje (žr. žemiau pateiktą pav.) matyti, kad su mažesniais duomenų rinkiniais (nuo 1000 iki 10000) MongoDB įrašymas atliekamas greičiau, lyginant su kitomis DB.
Didinant duomenų apimtis buvo pastebėta, kad duomenų įrašymą greičiau atlieka ArangoDB. Iš pateikto grafiko galima daryti išvadą, kad MongoDB duomenų bazė labiau tinka projektams, kuriuose nėra atliekami didelės apimties duomenų įrašymai. Projektuose, kuruose įrašomų duomenų apimtys yra didelės, geriau naudoti ArangoDB. CouchDB duomenų bazė atliktuose testuose pasirodė prasčiausiai, nes naudojant ją, esant didesniems duomenų kiekiams, įrašymo laikas ženkliai pailgėja.[3]
MongoDB
MongoDB yra nereliacinė duomenų bazė, kuri saugo duomenis dokumentuose JSON formatu. Gali pasirodyti ar kilti klausimas, o kaip su greičiais, norint duomenis gauti ar išsaugoti. NoSQL duomenų bazė yra kur kas greitesnė vien todėl, kad neturi sąryšių. Taip pat šiuos klausimus išsprendžia tai, jog priklausomai nuo projekto tipo, visada galima pasirinkti reikiamą talpinimo variklį (ang. Storage engine). Standartinis MongoDB talpinimo variklis MMAPv1, bet visada galima pasirinkti kitą. Pvz.: WiredTiger. Žinoma, prieš pasirenkant, reikia įvertinti, kas mūsų projekte svarbiau – ar didelis duomenų gavimo greitis ar didelis įrašymo greitis. Taip pat rekomenduočiau pasidomėti pačiomis talpinimo variklių savybėmis. Žemiau pateikta standartinė SQL situacija, kurioje „Post“ turi sąryšį su „Comment“ lentele (vienas su daug). Trumpai tariant, vartotojų rašomi įrašai, gali turėti daug komentarų. SQL tipo DB mes turime dvi lenteles: „Post“ saugoma informacija, susijusi su vartotojų įrašais, o „Comment“ – komentarai. Sekančiame paveikslėlyje pavaizduota, kaip yra saugomi duomenys MongoDB (JSON formatu) VIENOJE kolekcijoje. Tai viena iš savybių, kodėl NoSQL pasižymi didesne greitaveika, lyginant su SQL. Vartotojų komentarai yra įtvirtinti (embedded) „Post“ objekte. Žinoma, ne visada galima taip surišti duomenis ir saugoti juos vienoje kolekcijoje, dažniausiai surišami tie duomenys, kurie konkrečiai yra susiję su pasirinkta kolekcija.
SQL pavyzdinis duomenų modelis
MongoDB Posts kolekcijos įrašo pavyzdys
Manipuliavimas duomenimis
Kalbant apie MongoDB, ji turi, praktiškai, visus atitikmenis SQL, išskyrus Transactions (jau yra įskiepių, kurie integruoja šį funkcionalumą – https://www.percona.com). Detaliau apie tai, ką palaiko ir, kokius apribojimus turi ši DB, galima rasti oficialiame jos puslapyje. Dėl sparčiai besivystančios bendruomenės, galima rasti daug sprendimo būdų, o produkto kūrėjai nesnaudžia ir kuria vis naujas versijas su vis daugiau galimybių.
Naudojimas
Suinstaliavus MongoDB serverį ir pasileidus jį, galima pradėti naują projektą nuo pasirengimo darbų. Pavyzdinis projektas bus konsolinė aplikacija, kuri tiesiog skirta pademonstruoti kaip dirbti su DB.
Sekantis žingsnis, tai MongoDB draiverių įrašymas naudojant Nuget Package. Sėkmingai įdiegus bus įtraukiami visi reikiami šaltiniai, skirti tiek bendravimui su DB, tiek duomenų apdorojimui.
Kitas žingsnis, kuris yra standartinis, tai duomenų bazės modelio projektavimas. Kadangi norime tiesiog pavaizduoti MongoDB panaudojimą, tai apsiribosime tik viena kolekcija, kuri bus skirta saugoti vartotojus. Prisijungimui prie DB ir jos tvarkymui rekomenduoju naudoti Mongobooster GUI, bet DB galima valdyti ir naudojant komandinę eilutę.
Standartiškai projektuodami SQL tipo DB mes turime importuoti naujas DB lenteles, aprašydami reikiamą informaciją – stulpelių tipus. Šiuo atveju, mes apie tai negalvojame ir aprašome User klasę, kuri reprezentuos mūsų kolekciją.
Komunikacijos su DB parengimas
Pradžioje pasiruošiame klasę, kuri bus atsakinga už komunikaciją su DB. Standartiškai paleidus MongoDB, autorizacija yra išjungta, todėl nereikia jokių vartotoją autorizuojančių duomenų, norint prisijungti prie DB. Tačiau, vykdant realų projektą, reikėtų šį rėžimą įjungti ir užregistruoti naują vartotoją su atitinkamomis teisėmis.
Įrašų saugojimas
Susikonfigūravus ryšį su DB, galima pradėti dirbti. Pradžioje DB yra tuščia – nėra jokių kolekcijų, tačiau po InsertOne metodo, nauja kolekcija Users yra sukuriama ir naujas vartotojas yra patalpinamas.
Žemiau yra pateikiama, kaip atrodo naujas įrašas DB. Galima pastebėti jog UserNotes ir Hobies yra kitų duomenų, surištų (angl. embeded) su konkrečiu vartotoju, masyvai. Tokiu atveju SQL DB standartiškai reikėtų 3 lentelių, kuriuose būtų saugojama viskas atskirai.
Įrašų šalinimas
Žemiau yra pateikiamas pavyzdys, kaip atliekamas duomenų šalinimas iš MongoDB. Nurodžius User klasę Builders klasei, galime pilnai naudotis lambda išraiškomis formuojant filtrą. Filtro formavimas nėra apribojamas tik Eq (equal) operacija – jų yra kur kas daugiau (Gt – greater, Lt – less ir kt.).
Įrašų atnaujinimas
Žemiau yra pateikiamas pavyzdys, kaip atliekamas įrašo atnaujinimas. UpdateOne metodui paduodame filtrą, kuris nurodo, ką atnaujinsime ir taip pat, kokius atnaujinimus norima atlikti.
Duomenų paieška
Žemiau yra pateikiamas pavyzdys, kaip atliekama standartinė duomenų paieška. Galimi keli variantai: pirmas, tai naudojant Linq query išraiškas. Antrasis – naudojant lambda išraiškas. Taip pat yra galimi ir kiti variantai naudojant Builders filtrus. Abiejų užklausų rezultatai bus User tipo.
Apibendrinimas
Apibendrinant, reikėtų paminėti, jog pavyzdyje yra pavaizduoti tik standartiniai būdai, kaip galima realizuoti CRUD operacijas, tačiau realizacija gali būti kur kas dinamiškesnė ir net nebūtinai surišta su klasėmis, kaip pvz.: User. Yra galimybė naudoti tiesiog JSON formą, taip praleidžiant etapus, kur duomenys yra serializuojami ar deserializuojami, tačiau prarandame galimybę išnaudoti Linq bei lambda išraiškų galimybes. Kalbant apie likusias, ne ką mažiau svarbiasnes operacijas (SORT, JOIN), MongoDB naudoja agregacijų karkasą, apie kurį galima detaliau pasiskaityti MongoDB dokumentacijoje (http://mongodb.github.io/mongo-csharp-driver) [4].