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.

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

  1. Preuzeti LTS verziju sa linka https://nodejs.org/en/
  2. Pokrenuti preuzeti fajl i pratiti korake instalacije
  3. Nakon instalacije proveriti:
C:\Users\djordje>node -v v8.11.1 C:\Users\djordje>npm -v 5.6.0 
  1. Pokrenuti command prompt i kreirati folder sa imenom test u koji ćemo smestiti projekat

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

  1. https://en.wikipedia.org/wiki/MultiValue
  2. http://www.openqm-zumasys.com/openqm/what-is-multivalue
  3. http://stackoverflow.com/questions/4219624/pros-and-cons-of-multi-value-databases
  4. https://db-engines.com/en/article/Multivalue+DBMS
  5. http://www.alphadevx.com/a/36-Comparison-of-Relational-and-Multi-Dimensional-Database-Structures
  6. https://github.com/bfontaine/ArrayDB