Big Data, Data Science

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
Tagged , , ,