NoSQL duomenų bazės

Įvadas

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.
greitaveika
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
SQL pavyzdinis duomenų modelis
MongoDB Posts kolekcijos įrašo pavyzdys
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.
Projekto pradžia
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.
Nuget Package panaudojimas
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ą.
Standartinė klasė

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.
Komunikacija su DB

Į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.
Įrašų saugojimas
Ž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.
DB vaizdas

Į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šų šalinimas

Į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.

Įrašų atnaujinimas

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.

Duomenų paieška

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].

MongoDB įdiegimas Windows aplinkoje.

MongoDB paruošimas ir naudojimas .NET aplinkoje.

Literatūra

  1. J. COGSWELL , „SQL vs. NoSQL: Which Is Better?
  2. J. Steemann, „Bulk inserts in MongoDB, CouchDB, and ArangoDB,“ ArangoDB.
  3. „NoSQL Databases Explained,“ MongoDB.
  4. The MongoDB 3.2 Manual.

Visos teisės saugomos. Edgaras Norvaiša IFM-5/2 (PresentConnection)

Valid CSS!