MultiValue Databases na primeru ArrayDB Deo II
U prvom delu smo mogli da pročitamo o nekim karakteristikama MultiValue modela kao i o pojedinim prednostima u odnosu na MultiValue model. U ovom delu ćemo se baviti primerima upotrebe MultiValue modela kao i određenim pogodnostima koje MultiValue model pruža svojim korisnicimia.
Sadržaj
Preduslovi
Praktičnu primenu MultiValue modela pokazacemo na primeru ArrayDB-a. ArrayDB nam dozvoljava da nizove u našem programu posmatramo kao tabele i nad njima vršimo upite. Da bi izveli primere koristićemo NodeJS kao i ArrayDB bibilioteku.
Instalacija NodeJS-a
- Preuzeti LTS verziju sa linka https://nodejs.org/en/
- Pokrenuti preuzeti fajl i pratiti korake instalacije
- Nakon instalacije proveriti:
C:\Users\djordje>node -v v8.11.1 C:\Users\djordje>npm -v 5.6.0
Pokrenuti command prompt i kreirati folder sa imenom test u koji ćemo smestiti projekat
Otvoriti kreirani folder i u cmd-u pokrenuti komandu npm -init, nakon toga potrebno je uneti tražene informacije o projektu (obavezno je samo ime)
C:\Users\djordje>npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. package name: (djordje) version: (1.0.0) description: git repository: keywords: author: license: (ISC) About to write to C:\Users\djordje\package.json: { "name": "djordje", "version": "1.0.0", "main": "index.js", "dependencies": { "body-parser": "^1.16.0", "cookie-parser": "^1.4.3", "express": "^4.14.0", "multer": "^1.2.1", "npm": "^6.1.0" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "description": "" } Is this ok? (yes) yes
ArrayDB biblioteka
Sledećom komandom možemo preuzeti ArrayDB dodatak:
npm install arraydb
Komandu je potrebno pokrenuti iz foldera u kome je instaliran NodeJS.
Primer 1 Kreiranje baze
Za početak ćemo kreirati bazu pomoću ArrayDB-a na sledeći način:
var ArrayDB = require( 'arraydb' ).ArrayDB;
var a = new ArrayDB([
{ name: "Foo", age: 42 },
{ name: "Bar", age: 24 },
{ name: "Moo", age: 42 }
]);
Kod čuvamo u index.js fajlu.
Primer 2 pretraga
Ako bismo sada hteli da pretražimo naš niz, to možemo uraditi pomoću komande querry na sledeći način:
Console.log(a.query({ age: 42 }));
Program pokrećemo komandom node index.js. Izlaz bi izgledao ovako:
[ { name:"Foo", age:42 }, { name:"Moo",age:42} ]
Funkcija querry prima i sledeće argumente:
- limit [Broj]: Limitira broj vraćenih rezultata (podrazumevano vraća sve unose koji zadovoljavaju upit).
- reverse [Boolean]: Vraća rezultate u obrnutom redosledu
- strict [Boolean]: Uključujemo ili isključujemo striktni mod, u nastavku detaljnije objašnjavamo šta ovo znači
Argumenti se šalju kao objekat u formi key-value, na primer:
a.query({ query: { age: 42 }, limit: 1 });
Striktni mod
U ovom modu query funkcija vraća samo rezultate koji su striktno jednaki uslovu pretrage. Ovo je podrazumevano ponašanje funkcije.
var a = new ArrayDB( NaN, 'foo' );
a.query({ query: NaN }); // [ NaN ]
a.query({ query: NaN, strict: true }); // [ NaN ]
a.query({ query: NaN, strict: false }); // [ NaN, 'foo' ]
Kada je striktni mod isključen, ArrayDB pruža određene pogodnosti prilikom pretrage:
- Moguće je koristiti regularne izrare za testiranje stringova
- Moguće je slati funkcije koje određuju pripadnost člana niza rezultatu
- Moguće je naći sve vrednosti niza koje imaju određeno svojstvo
Možemo koristiti NaN da bi dobili sve vrednosti koje nisu broj
var a = new ArrayDB( { age: 2, name: „Bar“ }, { age: 46, name: „Foo“ }, { name: „NoAge“ } );
//dobijamo sve objekte koji imaju age svojstvo a.query({ query: { age: true }, strict: false });
// dobijamo samo imena koja počinju sa „F“ a.query({ query: { name: /^F/ }, strict: false });
Ako to želimo možemo svaki javascript niz učiniti ArrayDB nizom na sledeći način:
var ArrayDB = require( 'arraydb' ).ArrayDB;
ArrayDB.monkeyPatch();
typeof [].query === 'function'; // true
ArrayDB takođe omogućava korišćenje određenih pomoćnih funkcija:
- lt( e ): vraća elemente niza sa vrednošću manjom od e
- gt( e ): vraća elemente niza sa vrednošću većom od e
- le( e ): vraća elemente niza sa vrednošću manjom ili jednakom sa e
- ge( e ): vraća elemente niza sa vrednošću većom ili jednakom sa e
- eq( e ): vraća elemente sa vrednošću e
- ne( e ): vraća elemente niza sa vrednošću različitom od e
- any(): vraća elemente sa bilo kojom vrednošću „
var a = new ArrayDB( { name: "John Doe", age: 23 }, { name: "Foo Bar", age: 12 }, { name: "Bar Foo", age: 35 }, { name: "Bar Moo", age: 42 } ); // dobijamo objekte koji imaju svojstvo age veće od 18 a.query({ query: { age: ArrayDB.gt( 18 ) }, strict: false }); // dobijamo objekte koji imaju svojstvo age 42 a.query({ query: { age: ArrayDB.eq( 42 ) }, strict: false });
Zaključak
Iako je relacioni model trenutno ubedljivo najpopularniji on svakako nije bez alternative. Sa mnogim prednostima koje MultiValue model nudi i sve većim brojem korisnika koji prelaze na ovaj model MultiValue ima potencijal da postane sledeći standard u ovoj grani računarskih nauka.
Literatura
- https://en.wikipedia.org/wiki/MultiValue
- http://www.openqm-zumasys.com/openqm/what-is-multivalue
- http://stackoverflow.com/questions/4219624/pros-and-cons-of-multi-value-databases
- https://db-engines.com/en/article/Multivalue+DBMS
- http://www.alphadevx.com/a/36-Comparison-of-Relational-and-Multi-Dimensional-Database-Structures
- https://github.com/bfontaine/ArrayDB