Mediul de Programare Visual Studio
Cuprins
Introducere
Capitolul 1 Mediul de programare Visual Studio
1.1 Microsoft Visual Studio
1.2 Microsoft Visual C#
1.3 Limbajul de programare C#
1.4 Platforma .NET Framework
Capitolul 2 – Baze de date NoSQL
2.1 Notiuni generale de baze de date NoSQL
2.2 Tipuri de date NoSQL
2.3 Trăsăturile bazelor de date NoSQL
2.4 Baze de date NoSQL Key-Value
2.5 Realizarea aplicațiilor cu baze de date NoSQL
2.5.1 Alegerea sistemului de baze de date NoSQL utilizat
2.6 MongoDB
Capitolul 3 Implementarea unei aplicații software folosind baze de date NoSQL
Concluzii
Bibliografie
Introducere
Mediul de programare Visual Studio
Microsoft Visual Studio este un mediu de dezvoltare integrat (IDE) creat de compania Microsoft. Acest mediu include un set complet de instrumente de dezvoltare pentru aplicații ASP.NET, Servicii Web XML, aplicații Windows și aplicații mobile. El oferă un ecosistem cu mii de extensii pentru realizarea aplicațiilor.
Microsoft Visual Studio
Pentru realizarea aplicației comercială de gestiune hotelieră am folosit mediul de programare Microsoft Visual Studio.
Visual Studio folosește platforme de dezvoltare Microsoft și poate produce atât cod nativ cât si cod gestionat. Visual Studio are un editor de cod de tip IntelliSense- se referă la auto-sugestiile ce apar în timpul scrierii codului, precum si un cod de refactoring prin care este îmbunătățită structura interna a programului. Programul oferă parte de design pentru aplicațiile web, clase și schema bazei de date cât și compilator. În tabelul următor este prezentată un scurt istoric al mediului de programare Microsoft Visual Studio.
Tabel 1.1 Istoric Versiuni
Sursa Wikipedia.com, 2015
Visual Studio 97 a fost creat prin gruparea mai multor instrumente de programare, pentru prima dată. Acesta a inclus VisualJ1.1 pentru programarea Java, VisualInterDev, program folosit pentru crearea de site-uri generate dinamic și VisualC++ pentru programarea windows. Visual Studio 97 a fost prima încercare a companiei Microsoft de a dezvolta un sigur mediu de programare pentru mai mult limbaje.
Visual Studio 6.0 a fost ultima ediție care a rulat pe Windows 9x și inclus de asemenea o parte a fiecărui limbaj in parte. Această versiune a reprezentat baza pentru următoarele patru ediții lansate pentru a oferii programatorilor o platforma integrata și a condus Microsoft spre dezvoltarea platformei independente .NET Framework.
Visual Studio.NET a fost prima platforma care a introdus limbajul de programare C#, bazat pe platforma .NET Framework. Programele dezvoltate folosind .Net Framework nu sunt compilate în limbajul nativ, ci într-un format numit MSIL(Microsoft Intermediate Languages). Aici a fost introdus succesorul lui Visual J++ numit Visual J#.
Visual Studio2003 a avut doar modificări minore fața de versiunea anterioară. A venit in plus cu o versiune noua a .NET Framework și cu un instrument de conectare la bazale de date Oracle. În aceasta ediție, Visual Studio încurajează dezvoltarea aplicațiilor pentru mediul mobil cu ajutorul ASP.NET.
Visual Studio 2005 este ultima versiune disponibila pentru Windows 2000, iar mai târziu odată cu apariția Windows Vista, Microsoft a lansat Service Pack 1 pentru compatibilitate. De asemenea el a fost actualizat pentru a suporta toate noile caracteristici introduse în .Net Framework 2.0. Visual Studio 2005 include si un server local de web, care poate găzdui aplicații ASP.NET în timpul dezvoltării și testării lor și suportă conectarea la bazele de date SQL 2005.
Visual Studio 2008 s-a axat pe dezvoltarea de aplicații pentru Windows Vista și pentru aplicații web. Această versiune a venit cu un nou editor HTML/CSS dar nu are inclus J#. Aici programatorii pot alege cu ce versiune de .NET Framework să lucreze. Visual Studio 2008 vine cu instrumente noi de analizare a codului și cu MSBuild pentru a compila mai multe fișiere sursă și de a construii fișierul executabil simultan.
Visual Studio 2010 a fost reproiectat pentru a reduce din dezordine și complexitate. Noul Visual Studio suporta mai bine multiplele ferestre de windows deschise și monitoare multiple. Această versiune a adus cu ea limbajul de programare multi-paradigm F# dar și o versiune noua de .NET Framework-4.0. Visual Studio 2010 sprijină dezvoltarea aplicaților pentru Windows 7 și a integrat suport pentru dezvoltarea de aplicații Microsoft Silverlight. Instrumentele nou aduse ajută mai mult pentru crearea paralelă a aplicațiilor.
Visual Studio Ultimate 2010 înlocuiește cu succes versiunea anterioara prin introducerea de noi instrumente de modelare. Aceste instrumente afișează grafic proiectele, clasele si relațiile dintre ele. Tot pe partea grafica, Visual Studio 2010 suporta de asemenea diagrame UML precum: diagrama de activitate, diagrama de componente, diagrama de clase, diagrama de secvență și diagrama cazurilor de utilizare. O unealtă pentru creșterea productivității a fost introdusa in aceasta versiune, si anume IntelliTrace. Acest instrument simplifică foarte mult procesul de depanare al programului.
Visual Studio 2012 a adus o caracteristica nouă, destul de importantă, și anume suportul pentru Windows RT. La această versiune au fost aduse schimbări majore la interfață.
Visual Studio 2013 a îmbunătățit atât limbajele de programare suportate cât și performanța aplicațiilor. Odată cu el a apărut și o noua versiune de .NET Framework-4.5.1 care încurajează dezvoltarea de aplicații pentru Windows 8.1 și Windows Phone Silverlight 8.1. Cu ajutorul Visual Studio 2013 se pot realiza aplicații universale, care pot rula atât pe calculator cât si pe telefoane mobile.
În momentul de față, Microsoft Visual Studio are următoarele limbaje de programare incluse: Microsoft Visual C++, Microsoft Visual C#, Microsoft Visual Basic, Microsoft Web Developer, Team Foundation Server.
Microsoft Visual C#
Microsoft Visual Studio reprezintă un mediu puternic de programare pentru crearea aplicațiilor mici și mari realizate cu ajutorul limbajului de programare c#, care pot rula pe Windows 7, Windows 8 și Windows 8.1.
Microsoft Visual C# reprezintă implementarea specificațiilor limbajului de programare C# de către compania Microsoft, inclusă în suita de produse Microsoft Visual Studio. Acesta este bazat pe standardele ECMA/ISO ale limbajului C#, care au fost create tot de Microsoft. Dintre multitudinea platformelor, Visual C# este cel mai folosit.
Un exemplu de aplicație simpla în Visual Studio este „HelloWorld” . Pentru realizarea acestei aplicații deschideți platforma Visual Studio. După deschidere, programul afișează pagina de start. Din meniul File alegem New Project și o să se deschidă o casetă de dialog. Această casetă de dialog conține o listă cu șabloane care pot fi folosite ca și punct de plecare pentru aplicație. Caseta de dialog afișează șabloanele pe categorii în funcție de limbajul de programare folosit pentru aplicație. În continuare selectați din stânga tipul de limbaj dorit, în cazul acesta C# și tipul de șablon dorit. După acest pas Visual Studio creează proiectul folosind tipul de șablon selectat și afișează codul de început pentru aplicație. Meniul din partea de sus oferă acces la toate elementele care vor fi folosite în mediul de programare. De asemenea poate fi folosită atât tastatura cât si mouse-ul pentru accesarea meniului si a comenzilor. Partea principală afișată este ocupată de cod și de editorul de text. Într-un proiect cu mai multe fișiere, pentru editarea lor simultană, fiecare fișier are tab-ul lui împreună cu detaliile sursei fișierului. Fereastra Solution Explorer este afisată în partea dreaptă a casetei de dialog și afișează numele fișierelor asociate cu proiectul împreună cu alte lucruri. În fereastra Solution Explorer găsim fișiere create automat de Visual Studio precum:
Solution – acesta reprezintă fisierul care ajută la organizarea proiectului. Fișierul Solutions poate conține mai multe proiecte;
Un fișier cu numele proiectului. Fiecare fișier al proiectului are unul sau mai multe fișiere care conțin codul sursă al proiectului împreuna cu alte elemente, cum ar fi imaginile grafice. Toate codurile sursă ale unui proiect trebuie scrise într-un singur limbaj.
Proprietăți – acest fișier este inclus în fișierul cu numele proiectului. Daca extindem acest fișier, vedem că el conține un alt fișier numit AssemblyInfo.cs. Cu ajutorul acestui fișier putem adăuga la proiect diferite atribute precum: data creării proiectului, numele autorului, etc.
Referințe – Acest folder conține librăriile codului sursă pe care aplicația le poate folosi. Când proiectul este compilat, este convertit într-o librărie și îi este asociat un nume unic. Daca extindem fișierul Referință putem vedeam setul de referință pe care Visual Studio îl adaugă automat proiectului.
App.config – Acesta reprezintă fișierul de configurație. Pot fi specificate setări pe care aplicația le poate folosi când rulează pentru a-i modifica comportamentul.
Program.cs – Acesta este fișierul sursă și este afișat în fereastra pentru editarea codului și a textului când proiectul este creat. În acest fișier se scrie codul aplicației dar conține și un anumit cod generat automat de Visual Studio.
Fișierul Program.cs definește o clasă numită „Program” care conține o metodă numita „Main”. În limbajul de programare C# toate codurile executabile trebuie definite într-o metodă, și toate metodele trebuie sa aparțină unei clase. Metoda „Main” desemnează punctul de început al proiectului și trebuie să fie definită în modul specificat de clasa „Program”, ca o metodă statică deoarece numai în acest fel este recunoscută ca si punct de început pentru aplicație.
După scriere codului pentru aplicație în metoda principală, pentru rularea aplicației se deschide din meniul Build opțiunea Build Solutions. Această acțiune compilează codul și îl transformă într-un program care poate fi rulat. În timpul compilării, în partea de jos a ferestrei pentru editarea codului va apărea fereastra Output. Fereastra Output afișează erorile, dacă sunt, dacă aplicația nu are nici o eroare, compilarea se termină cu succes. Pentru rularea aplicație selectați din meniul Debug opțiunea Start Without Debugging.
Exemplul de aplicație descris mai sus, este un exemplu de aplicație simplă. Totuși o aplicație mică poate crește în una mai mare și mult mai complexă. În timpul dezvoltării unui program, apar două probleme. În primul rând, este mai greu de înțeles și întreținut un program mai mare decât unul de mici dimensiuni. În al doilea rând, scrierea unui număr mai mare de coduri presupune crearea mai multor clase, cu mai multe metode. În momentul în care numărul de nume folosite creste, creste și riscul de a realiza un proiect cu elemente lipsă și cu conflicte de nume.
În trecut programatorii au încercat să rezolve conflictul dintre nume prin introducerea unor prefixe cu o anumită calificare. Această soluție nu este una bună deoarece nu este scalabila, numele devenind foarte lung.
Spațiile de nume(Namespaces) au reprezentat rezolvarea, prin crearea unor containere pentru elemente numite clase. O bună practică este definirea tuturor claselor în namespace-uri. Visual Studio urmează aceeași recomandare folosind numele proiectului ca namespace de nivel superior. Biblioteca .NET aderă de asemenea la această recomandare; fiecare clasă din librăria .NET este inclusă într-un namespace. Pentru a nu se mai folosi prefixarea, se folosesc directive, de exemplu: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks. Folosind directivele, namespace-urile sunt aduse în domeniu. În codul ulterior din același fișier, nu mai este nevoie de a califica în mod explicit obiectele cu namespace-ul din care fac parte. Exemplele de directive de mai sus sunt foarte des folosite în Visual Studio, ele fiind adăugate automat de fiecare dată când un proiect nou este creat. Ulterior se pot adăuga alte directive în funcție de cerințele proiectului.
Clasele sunt compilate în ansambluri. Un ansamblu este un fișier care de obicei are extensia .dll, deși strict vorbind, programele executabile cu extensia .exe sunt de asemenea ansambluri. Un ansamblu conține mai multe clase. Clasele pe care librăria .NET le conține, sunt concentrate în ansambluri de clase care sunt instalate automat în calculator odată cu Visual Studio. Librăria .NET conține mii de clase. Daca aceste clase ar fi păstrate în același ansamblu, dimensiunile ansamblului de clase ar fi foarte mare. Pentru acest motiv, librăria de clase .NET este împărțită în mai multe ansambluri, repartizate după zona de funcționalitate a claselor. De exemplu mscorlib.dll conține toate clasele comune, iar alte ansambluri conțin clase pentru manevrarea bazelor de date, pentru accesarea serviciilor web, etc. Între namespace-uri și ansambluri de clase nu este necesară o echivalență de 1:1. Un singur ansamblu poate conține mai multe clase definite în multe namespace-uri, și un singur namespace poate deschide mai multe ansambluri. Când folosim Visual Studio în crearea unei aplicații, șablonul ales la început include referințe la ansamblurile adecvate.
Limbajul de programare C#
Limbajul de programare C# a apărut prima dată in public în anul 2001 și a fost dezvoltate de compania Microsoft. El este alcătuit din 80 de cuvinte cheie și conține 12 tipuri de date predefinite. Principiile de baza ale limbajului C# sunt: încapsularea, moștenirea și polimorfismul. El a fost scos pe piață cu scopul de a concura cu limbajul Java.
C# este deopotrivă un limbaj puternic, este ales în mod primar de către programatori pentru crearea aplicațiilor ce rulează pe platformele Micosoft. C# moștenește cele mai bune caracteristici ale limbajului C++, dar are un limbaj mai logic. Limbajul de programare C# este un limbaj multi-paradigmă, imperativ, funcțional, generic cuprinzând programarea orientată-obiect și orientată-componentă.
Odată cu lansarea Visual Studio 2005 a apărut și C# 2.0 cu îmbunătățiri vizibile: generice, iteratori, etc. C# 3.0 a fost lansat cu Visual Studio 2008, iar cea mai importanta îmbunătățire fiind LINQ(Language Integrated Query-Interogari integrate în limbaj). LINQ este o componentă a platformei Microsoft.NET care adaugă suport pentru interogări de date direct din sintaxa limbajelor .NET. Următoarea versiune a limbajului C# a fost lansată în 2010, aceasta având îmbunătățiri pe partea de interoperabilitate cu alte tehnologii. Cea mai nouă versiune a limbajului de programare este C# 5.0 și adaugă suport pentru procesări bazate pe obiective asincrone prin cuvintele cheie async si await.
C# include o serie de variabile si constante. Fiecare variabilă si constantă are un tip, la fel ca orice expresie care este egală cu o anumită valoare. Fiecare semnătură de metodă specifică un tip pentru parametrul de intrare și pentru valoarea returnată. Librăria de clase .NET definește un set de tipuri de construcții numerice, precum si alte tipuri mai complexe care reprezintă o mare varietate de construcții logice pentru fișierele sistemului, conexiunile de rețea, colecții si tablouri de obiecte și date. Un program tipic realizat cu C# folosește tipuri atât din biblioteca claselor cât și tipurile definite de utilizator pentru modelarea conceptelor specifice domeniului programului.
Informațiile stocate într-un tip pot avea următoarele caracteristici:
Spațiul de stocare pe care o variabilă îl cere;
Valorile maxime și minime;
Membrii – metode, câmpuri, evenimente, etc;
Tipul de bază;
Locația unde este alocat spațiul necesar în timpul rulării aplicației;
Diferite tipuri de operații permise;
Compilatorul folosește aceste informații pentru a se asigura că toate operațiile realizate în codul scris sunt sigure. De exemplu, dacă declaram o variabila de tip integer, compilatorul permite utilizarea variabilei în operațiile de adunare și scădere. Daca încercam aceleași operații cu o variabilă de tip boolean, compilatorul generează o eroare. Compilatorul încorporează informațiile despre tipuri într-un fișier executabil, ca metadate. CLR-ul folosește aceste metadate în momentul execuției programului pentru a garanta în continuare siguranța tipurilor de variabile atunci când aloca și revendică memorie. Când declaram o variabilă sau o constantă, trebuie specificat tipul sau se poate folosii cuvântul cheie var pentru a lăsa compilatorul să deducă singur tipul. După ce o variabilă a fost declarată, ea nu poate fi redeclarată cu un nou tip și nu i se poate atribuii o valoare care nu este compatibilă cu tipul declarat. De exemplu, nu se poate declara o variabila de tip integer iar apoi să i se atribuie o valoare de tip boolean. Totuși, valorile atribuite pot fi convertite în alte tipuri atunci când unor variabile noi sau atunci când sunt folosite ca argumente pentru metode. O conversie de tip care nu aduce nici o pierdere de date este realizată în mod automat de către compilator. O conversie care ar putea duce la pierderi de date, necesită o distribuție în codul sursă.
C# oferă un set standard de tipuri numerice pentru a reprezenta numere întregi, expresii de tip boolean, caractere text, valori zecimale, și alte tipuri de date. Pentru crearea de noi tipuri de date se pot folosi construcțiile struct, class, interface și enum.
Tipurile de valori sunt derivate din System.ValueType, care la rândul lui este derivat din System.Object. Tipurile care derivă din System.ValueType, se comportă special în CLR. Variabilele de tip valoare conțin direct valoarea lor, ceea ce înseamnă că memoria este alocată în linie în orice context în care variabila este declarată. În C# există două categorii de tipuri de valori: struct și enum.
Tipurile de valori sunt sigilate, ceea ce înseamnă că, spre exemplu, ele nu pot fi deriva un tip de date din System.Int32 și nu este posibilă definirea unei structuri care să moștenească orice clasă sau structură definită de utilizatori pentru că o structură poate moșteni doar de la System.ValueType. Totuși o structură poate implementa una sau mai multe interfețe. Cealaltă categorie de tipuri de valori este enum. Tipul enum definește un set de constante integrale predefinite. Spre exemplu, enumerația System.IO.FileMode conține un set de nume de constante întregi care arată modul în care un fișier ar trebui sa fie deschis. Toate tipurile de date enum moștenesc clasa System.Enum,care moștenește la rândul ei clasa System.ValueType. Un tip care este definit ca o clasă, delegat, matrice sau interfață reprezintă un tip de referință. La momentul execuției, când este declarată o variabilă de tip referință, variabila are valoare nulă până când se creează în mod explicit o instanță a obiectului folosind operatorul new.
O interfață trebuie inițializată împreună cu o clasă obiect implementată. Tipurile de referință suportă în totalitate moștenirea. În momentul în care o clasă este creată, această clasă poate moșteni caracteristici de la orice altă interfață sau clasă care nu este definită ca fiind sigilată.
Un tip de date poate avea unul sau mai mulți parametri care servesc ca substituent pentru tipul anterior. Astfel de tipuri poartă denumirea de tipuri generice. Utilizarea parametrului tip face posibilă refolosirea aceleași clase pentru a deține orice fel de elemente, fără a converti elementele în obiecte. Colecțiile de clase generice sunt numite strongly-typed deoarece compilatorul știe tipul specific colecțiilor de elemente și poate genera o eroare în timpul compilării.
Alte tipuri de date specifice limbajului C# sunt tipurile de date string. Un string reprezintă un tip de obiect a cărui valoare este text. Pe plan intern, textul este stocat ca o colecție de secvențe read-only de obiecte de tip char. La sfârșitul unui string în C# nu există caractere nule. Prin urmare, un șir de caractere în C# poate conține orice număr de caractere nule în interiorul șirului. Lungimea unui sir de caractere este dată de numărul de obiecte char conținute. Clasa String oferă multe metode pentru crearea în condiții de siguranță, manipularea și compararea șirurilor. În plus, C# încarcă unii operatori pentru a simplifica operațiile comune ale șirurilor de caractere. Șirurile de caractere pot si declarate și inițializate în multiple moduri, de exemplu:
Sir de caractere declarat fără inițializare
string message1;
Inițializare nulă
string message2 = null;
Inițializare ca sir de caracter gol
string message3 = System.String.Empty;
Inițializare cu un șir literal regulat
string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0";
Inițializare cu un sir literal verbatim
string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0";
Folosirea System.String
System.String greeting = "Hello World!";
Sir de caractere declarate si inițializate într-o variabilă locală
var temp = "I'm still a strongly-typed System.String!";
Folosirea unui const string
const string message4 = "You can't get rid of me!";
Utilizarea constructorului string – se folosește doar atunci când se creează un string pornind de la un char
char[ ] letters = { 'A', 'B', 'C' };
string alphabet = new string(letters);
Obiectele de tip string sunt invariabile, adică nu pot fi schimbate odată ce au fost create. Toate metodele clasei String și toți operatorii C# care dau impresia ca ar putea modifica un string de fapt returnează rezultatele într-un nou obiect de tip string. Pentru ca modificarea unui string este de fapt crearea unui nou string, trebuie acordată o atenție sporită pentru crearea referințelor șirului de caractere. Dacă a fost creată o referință pentru șirul de caractere, iar apoi acesta a fost modificat, trimiterea va continua sa indice obiectul original în loc de noul obiect creat atunci când a fost modificat șirul inițial.
Șirurile de caractere verbatime sunt folosite pentru confort și o mai bună lizibilitate atunci când sirul conține caractere precum „/”. Șirurile de caractere verbatime sunt folosite și pentru a inițializa string-urile cu multiple linii.
Un substring reprezintă orice secvență de caractere care este incluse într-un string. Metoda subșirurilor este utilizată pentru a crea un nou sir de caractere dintr-o anumită parte a șirului inițial. Pentru a căuta aparițiile subșirului se folosește metoda IndexOf, iar pentru înlocuirea tuturor aparițiilor unui anumit subșir cu un nou șir se folosește metoda Replace. Ca si metoda Substring, metoda Replace returnează de fapt un nou șir, nemodificându-l pe cel inițial. Daca metodele String nu oferă funcționalitatea necesară pentru modificarea caracterelor individuale dintr-un string, se pot folosi metoda StringBuilder.
Operațiile cu șiruri în .NET sunt extrem de optimizate și în cele mai multe cazuri nu afectează în mod semnificant performanțele. Cu toate acestea, în unele situații precum buclele strânse care execută de sute sau mii de ori, operațiile cu șiruri pot afecta performanța. Clasa StringBuilder creează un șir tampon care oferă performanță mai bună în cazul în care programul folosește foarte multe operații cu string-uri. Șirul StringBuilder permite de asemenea realocarea caracterelor individuale.
Limbajul de programare C# include de asemenea declarații, expresii si operatori. Acțiunile pe care un program le face sunt exprimate în declarații. Declarațiile comune includ declararea variabilelor, atribuirea de valori, folosirea metodelor, ramificarea codului, în funcție de o anumită condiție. Ordinea în care sunt executate acțiunile sunt executate se numește flux de control al fluxului de execuție. Fluxul de control poate varia de fiecare dată când un program este rulat, în funcție de modul în care programul reacționează la intrările pe care le primește în momentul execuției. O declarație poate fi doar o singură linie de cod care se termină cu punct si virgulă, sau o serie de declarații unice grupate într-un bloc. Un bloc de declarații este închis între două acolade.
O expresie reprezintă o secvență alcătuită din unul sau mai mulți operanzi și zero sau mai mulți operatori care pot fi evaluați într-o singură valoare, obiect, metodă sau namespace. Expresiile pot fi alcătuite dintr-o valoare literală, o metodă invocată, un operator și operanzi lui sau dintr-un simplu nume. Numele simple pot fi nume de variabile, namespace, etc. Expresiile pot utiliza operatorii care, la rândul lor folosesc alte expresii ca parametri, sau metoda de apel a căror parametri sunt în compunerea unei alte metode de apel. Modul în care este evaluată o expresie este reglementată de normele de asociativitate și de operatorul prioritar. Cele mai simple două tipuri de expresii sunt expresiile literale și nume simple. O expresie literală este o valoare constantă care nu are denumire. O expresie poate fi amplasată oriunde în limbajul de programare C# unde este necesară o valoare sau un obiect, atât timp cât expresia evaluează în cele din urmă tipul necesar.
În C#, un operator este un element din program care este aplicat unuia sau mai multor operanzi, într-o expresie sau o declarație. Operatorii care au un singur operand, de exemplu operatorul de incrementare(++) sau operatorul new, sunt denumiți operatori unari. Operatorii care au mai mulți operanzi, de exemplu operatorii aritmetici, poartă denumirea de operatori binari. Un operand poate fi o expresie validă care este compusă din cod și poate cuprinde oricât de multe subexpresii. Pentru schimbarea comportamentului operatorilor din clase și structuri se folosește supraîncărcarea.
Limbajul de programare C# are anumite proprietăți. O proprietate este membru care are un mecanism flexibil pentru a citi, a scrie sau a calcula valoarea unui câmp privat. Proprietățile pot fi folosite ca si date publice, dar de fapt ele sunt metode speciale denumite accessors. Acest lucru permite ca datele să fie accesate cu ușurință și contribuie la promovarea flexibilității si securității metodelor. Proprietățile dețin anumite caracteristici precum:
Proprietățile permit claselor să expună o modalitate publică de o obține și de a stabili valorile, în timp ce ascunde codul de implementare și verificare;
proprietate de tip get este folosită pentru a returna valoarea proprietății, iar o proprietate de tip set este folosită pentru asignarea unei noi valori;
Cuvântul cheie value este folosit pentru definirea valorii asignate de către proprietatea set;
Proprietățile sunt read-only, în afară de set;
Pentru proprietățile simple care nu necesită cod personalizat, se poate aplica opțiunea de auto-implementare;
Evenimentele permit claselor și obiectelor să notifice alte clase sau obiecte când intervine un punct de interes. Clasele care trimit evenimentul sunt denumite editoare iar cele care primesc evenimente se numesc abonați. Caracteristicile evenimentelor sunt:
Editorul determină atunci când un eveniment va apărea, iar abonații determină ce măsuri sunt luate ca răspuns la eveniment
Un eveniment poate avea mai mulți abonați iar un abonat poate susține mai multe evenimente de la mai mulți editori;
Evenimentele nu pot exista fără abonați;
În biblioteca .NET, evenimentele se bazează pe delegatul EventHandler și pe clasa de bază EventArgs;
Limbajul de programare C# este direct legat de platforma .NET,. El folosește bibliotecile platformei. Caracteristicile care îl recomandă sunt: simplitatea și modernitatea, utilitatea generală și productivitate mare.
În limbajul de programare C# se găsesc doua tipuri de date :date valorice și date referință. Datele valorice sunt: date simple, date enumerate și date structură, iar cele referință sunt de tipul clasă, tipul interfață, tipul delegat și tipul tablou. Toate tipurile de date provin din clasa System.Object. Pe lângă aceste tipuri de date, limbajul C# îngăduie definirea unor tipuri personale.
C# include și tipuri predefinite precum: string, object, tipuri întregi, tipuri numerice, tipuri bool si tipuri decimal.
O aplicație C# este alcătuită din: spații, cuvinte cheie C#, literali si identificatori. Programatorii aleg C# deoarece facilitează realizarea unei aplicații complexe.
Platforma .NET Framework
Platforma .NET reprezintă un cadru de dezvoltare software unitară, unde se pot realiza diferite aplicații Windows sau Web cu ajutorul mai multor limbaje de programare precum: C#, VB.NET, C++ și F#. Toate aceste limbaje au ca elemente de baza: clase, interfețe, delegări, tipuri valoare și referință și respectă un set de caracteristici de baza Common Language Specification. Această platformă este inclusa în sistemul de operare Windows și este formată din compilatoare, biblioteci si alte executabile utile in rularea aplicațiilor .NET
Figura 1.1. Arhitectura .NET Framework (Sursa: Tătăran et al., 2008)
Aceasta platformă include o foarte mare bibliotecă de clase denumită Framework Class Library și oferă interoperabilitatea între limbaje de programare. Framework Class Library oferă utilizatorilor interfață, accesul la date, conectivitatea la o baza de date, criptografie, crearea si dezvoltarea de aplicații web și rețele de comunicații.
Aplicațiile create cu ajutorul unuia dintre limbajele .NET este compilat în Microsoft Intermediate Language(MSIL). Codul compilat are extensia „.exe” și nu este direct executabil, el respectă formatul unic MSIL.
Platforma .NET are la bază standardul Common Language Infrastructure, care face ca toate aplicațiile .NET să aibă proprietatea de portabilitate, adică au posibilitatea sa ruleze și pe alte sisteme de operare precum Unix, Linux, Mac OS X.
În vederea securității, platforma deține propriul mecanism de securitate cu două caracteristici generale: Cod de accesare securizată și validare și verificare. Codul de accesare securizată are la baza dovezi asociate cu sursa ansamblului.
– Baze de date NoSQL
Conceptul de NoSQL a fost utilizat prima orară în anul 1998 de către Carol Strozzi, acesta fiind numele bazei sale relaționale fără interfață SQL. Termenul de NoSQL a fost folosit pentru a marca evoluția de la baze de date relaționale spre baze de date cu performanțe mai mari.
Bazele de date NoSQL s-au dezvoltat mai mult pe langă companiile mari de pe internet precum Google, Amazon și Facebook. Aceste companii folosesc o cantitate mare de date, iar bazele de date tradiționale nu au mai făcut față.
Notiuni generale de baze de date NoSQL
Bazele de date tradiționale nu sunt făcute să se ocupe de cererile mari de date. Acest lucru se întâmpla deoarece bazele de date tradiționale de tip relațional sunt făcute să se ocupe numai de seturi de date relaționale, construite din date care sunt stocate în rânduri și coloane curate și au capacitatea de a fi interogate prin SQL. Sistemele de baze de date tradiționale de tip relațional nu sunt capabile să manipuleze datele semi-structurate și nestructurate. Chiar mai mult, sistemul tradițional de gestiune a bazelor de date nu are capacitățile de procesare si manipulare necesare unui volum mare de date.
Bazele de date de tip „nu numai Sql”(NoSQL) reprezintă un mecanism de stocare si accesare a datelor ce realizează acces rapid la date și are proprietățile: scalabilitate și flexibilitate.
Termenul „nu numai Sql” indica faptul că se aduc îmbunătățiri bazelor de date SQL clasice, acestea folosind tipuri de structuri de date diferite de structura de date relațională. Datele de tip NoSQL sunt semi-structurate sau nestructurate.
Tipuri de date NoSQL
NoSQL oferă patru categorii de baze de date nerelaționale (Brand, 2015,p. 29):
baze de date graf;
baze de date document;
baze de date coloană;
baze de date cheie-valoare.
În cazul bazelor de date coloană, datele sunt stocate în celule grupate pe coloane. Coloanele sunt grupate în familii de coloane. Avantajul stocării bazată pe coloane este eficiența cu care este calculată valoarea unei funcții agregate. Exemple de baze de date organizate pe coloană: Accumulo, Cassandra, HBase, etc.
Bazele de date de tip document au ca baza principală: documentul. În general, documentele pot fi salvate în diferite forme, de exemplu: JSON, BSON, XML,etc. Documentele din bazele de date NoSQL sunt mai flexibile deoarece nu este necesară o schemă predefinită a lor și nici aceleași secțiuni sau chei.
Bazele de date NoSQL stochează date folosind chei de identificare, iar datele sunt regăsite cu ajutorul cheilor asignate. Aceste baze de date sunt mai flexibile și se adaptează ușor la schimbările de model.
Tabel 2.2 Sisteme de gestiune a bazelor de date de tip document si limbaje de cereri asociate
Sursa AS. Bogdan Tudorică, 2015
Bazele de date de tip valoare reprezintă aplicații simple în care cheia este unica și are atașată o valoare. Caracteristicile principale ale acestora sunt: disponibilitatea pentru scriere și scalabilitatea. În reprezentarea bazelor de date de tip cheie-valoare apare o tabelă de dispersie de chei unice numită tabela hash. Tabelele hash sunt folosite împreună cu mecanismele cache pentru mărirea performanțelor. Un concept caracteristic stocării bazelor de date de tip cheie-valoare este buchetul. Buchetul grupează logic mai multe chei-valori, iar fizic le grupează în locuri diferite pe disc. Pentru citirea unei valori este trebuie cunoscute cheia și buchetul. Tipuri de baze de date de tip cheie-valoare: Dynamo, FoundationDB, MemcacheDB, Redis, Riak, FairCom c-treeACE;
Bazele de date de tip graf sunt stocate cu ajutorul nodurilor, relațiile dintre acestea și proprietăți ale nodurilor. Avantajul acestor tipuri de date este ca sunt flexibile, pot fi scalate într-o perioadă mai mică de timp și nu folosesc o schemă rigidă. Pentru a găsi elementele adiacente, bazele de date de tip graf folosesc relațiile dintre noduri. Ca si timp de execuție, ele pot scala colecții mari de date deoarece nu sunt necesare operațiile de join. În general bazele de date de tip graf sunt rapide pentru colecțiile de date asociative și se potrivește mai bine proiectării orientată pe obiect. În tabelul de mai jos sunt prezentate mai multe tipuri de implementări ale bazelor de date NoSQL pe partea de grafuri.
Tabel 2.3 Implementări ale bazelor de date NoSQL-Grafuri
Trăsăturile bazelor de date NoSQL
NoSQL oferă funcționalitate nativă pentru fiecare tip de date specificate mai sus, oferind o foarte bună funcționalitate de stocare și regăsire pentru majoritatea tipurilor de date nerelaționale. Adaptabilitatea și eficiența fac ca NoSQL să devina din ce în ce mai popular când vine vorba de manipularea unor baze mari de date și a provocărilor care vin odată cu acestea.
Formalizarea constrângerilor bazelor de date NoSQL și sistemele aferente lor au ca și punct de plecare teorema CAP. Teorema CAP se referă la: consistență, disponibilitate și toleranță la partiționare:
Consistența presupune ca in orice moment, toți utilizatorii sistemului să vadă aceleași date.
Disponibilitatea se referă la faptul că fiecare cerere primește un răspuns.
Toleranța la partiționare este o caracteristică a sistemului care permite funcționarea acestuia atunci când unele noduri nu sunt funcționale.
Rick Cattel a precizat in cartea lui numita CATT10, următoarele șase trăsături pentru bazele de date NoSQL:
Bazele de date NoSQL scalează pe mai multe servere, orizontal.
Trăsătura de a copia și a repartiza datele pe mai multe servere.
CLI(Call Level Interface).
Bazele de date NoSQL au un model concurențial mai slab decât modelul relațional.
Stocarea eficientă prin folosirea eficace a indexării distribuite și a RAM.
Trăsătura de a adăuga dinamic noi atribute la înregistrările existente.
Bazele de date NoSQL nu conțin scheme, nu stochează relațiile dintre tabele, iar prin aceste caracteristici mărește performanța aplicațiilor care le folosesc.
Clasificarea bazelor de date NoSQL
Bazele de date NoSQL prezintă o varietate mare. In funcție de caracteristicile lor Yen Stephen a realizat o clasificare a lor. În opinia lui Yen Stephen bazele de date NoSQL se împart în:
Baze de date Key-Value Cache – Coherence, eXtreme Scale, GigaSpaces, GemFire, Hazelcast, Infinispan, JBoss Cache, Memcached, Repcached, Terracotta, Velocity
Baze de date Key-Value Store – Flare, Keyspace, RAMCloud, SchemaFree
Baze de date Key-Value Store (Eventually-Consistent) – DovetailDB, Dynamo, Riak, Dynomite, MotionDb, Voldemort, SubRecord
Baze de date Key-Value Store (Ordered) – Actord, FoundationDB, Lightcloud, Luxio, MemcacheDB, NMDB, Scalaris, TokyoTyrant
Baze de date Data-Structures server – Redis
Baze de date Tuple Store – Apache River, Coord, GigaSpaces
Baze de date Object Database – DB4O, Perst, Shoal, ZopeDB
Baze de date Document Store – Clusterpoint, CouchDB, MarkLogic, MongoDB, XML-databases, BigTable, Cassandra, HBase,
Baze de date Wide Columnar Store – Hypertable, KAI, KDI, OpenNeptune, Qbase
O altă clasificare a bazelor de date NoSQL a fost realizată de Ben Scofield. El a clasificat bazele de date NoSql în funcție de proprietățile lor. În tabelul de mai jos este prezentată taxonomia lui Ben Scofield.
Tabel 2.4.1 Taxonomia Ben Scofield
Un criteriu după care mai pot fi clasificate bazele de date NoSQL este reprezentat de metoda de implementare. În funcție de acest criteriu, se disting:
Document store (Apache Jackrabbit, Apache CouchDB, Lotus Notes, MongoDB, MarkLogic Server, eXist, SimpleDB, Terrastore).
Graph (AllegroGraph, Neo4j, DEX, FlockDB).
Key-value store, cu următoarele subtipuri: Eventually‐consistent key‐value store (Cassandra, Dynamo, Hibari, Project Voldemort, Riak); Hierarchical key-value store (GT.M); Hosted services (Freebase); Key-value cache în RAM (Citrusleaf database, memcached, Oracle Coherence, Redis, Tuple space, Velocity); Key-value stores care implementează algoritmul Paxos (Keyspace); Key-value stores pe disc (BigTable, CDB, Citrusleaf database, Dynomite, Keyspace, membase, MemcacheDB, Redis, Tokyo Cabinet, TreapDB, Tuple space, MongoDB).
Multivalue databases (Extensible Storage Engine -ESE/NT, OpenQM, Revelation Software's OpenInsight, Rocket U2).
Baze de date orientate obiect (db4o, GemStone/S, InterSystems Caché, JADE, Objectivity/DB, ObjectStore, Versant Object Database, ZODB).
Ordered key-value store (Berkeley DB, IBM Informix C-ISAM, MemcacheDB, NMDB).
Tabular (BigTable, Hbase, Hypertable, Mnesia), Tuple store (Apache River).
Baze de date NoSQL care stochează perechi cheie-valoare
O bază de date de tip cheie-valoare reprezintă o aplicație concepută pentru stocarea, recuperarea și gestionarea tablourilor asociative și structurilor de date, cunoscute astăzi sub numele de dicționare. Aceste dicționare conțin colecții de obiecte sau înregistrări care la rândul lor au diferite câmpuri ce conțin date. Înregistrările sunt stocate utilizând o cheie care identifică în mod unic înregistrarea. Bazele de date de tip cheie-valoare lucrează într-un mod diferit față de bazele de date relaționale. Bazele de date relaționale definesc structura bazei de date ca o serie de tabele care conțin câmpuri cu tipuri de date definite, în schimb, sisteme de tip cheie-valoare tratează datele ca o singură colecție, care poate avea câmpuri diferite pentru fiecare înregistrare. Acest lucru oferă o flexibilitate mare și permite o mai strânsă legătură cu conceptele moderne de programare. Bazele de date de tip cheie-valoare folosesc mai puțină memorie, pentru a stoca o bază de date, decât bazele de date relaționale. Acest lucru poate duce la câștiguri de performanță pentru alte sarcini de lucru.
În cazul bazele de date din categoria key-value precum Amazon Dynamo, Amazon s3, Riak, etc. obiectele sunt identificate cu ajutorul cheilor unice în interiorul unui buchet. Bazele de date de tip key-value nu prezintă scheme predefinite, iar cheia poate fi sintetica sau auto-generată. Valoarea asociata poate fi aleasă aleatoriu: de tip String, JSON, etc. Bazele de date key-value, făcând referire la teorema CAP, se descurcă foarte bine pe partea de disponibilitate și pe partea de toleranță la partiționare, însă are unele minusuri pe partea de consistență.
Implementări ale bazelor de date NoSQL Key-Value:
Key-Value (DynamoDB, Azure Table Storage, Riak, Redis, Aerospike, FoundationDB, LevelDB);
Key-Value – eventually consistent (Dynamo, Riak);
Key-Value – immediately consistent(FairCom c-treeACE);
Key-Value – ordered(Berkeley DB, FairCom c-treeACE/c-treeRTG, FoundationDB, C-IS IBM Informix AM, InfinityDB, MemcacheDB, NDBM);
Key-Value-RAM(Coherence, FairComctreeACE, GemFire, Hazelcast ,memcached, redis, OpenLink Virtuoso, XAP);
Key-Value – solid-state drive or rotating disk(Aerospike,BigTable, CDB, Clusterpoint XML database, Couchbase Server, GT.M, FairCom c-treeACE, Hibari, Keyspace, LevelDB, MemcacheDB (using Berkeley DB), MongoDB, Oracle NoSQL Database, Tarantool, Tokyo Cabinet, uple space, OpenLink Virtuoso);
Baze de date NoSQL de tip depozit de documente
Bazele de date NoSQL de tip depozit de documente reprezintă un program realizat pentru stocarea, regăsirea și administrarea colecțiilor de documente. Aceste tipuri de baze de date NoSQL reprezintă o subclasă a bazelor de date NoSql de tip cheie-valoare. Diferența dintre cele două constă în modul în care datele sunt prelucrate. Sistemele NoSQL de tip depozit de documente prelucrează datele bazându-se pe structura internă a documentelor pentru a extrage metadate, care ulterior sunt folosite de motorul bazei de date pentru optimizare. Conceptual bazele de date NoSQL de tip document au fost concepute pentru a oferi o experiență mai bună folosind tehnicile de programare moderne. Bazele de date NoSQL de tip depozit de documente stochează toate informațiile împreună. Acest lucru le face mai flexibile în abordarea schimbărilor și reduce semnificativ dimensiunea bazei de date.
Bazele de date NoSQL de tip depozit de documente sunt foarte atractive pentru aplicațiile web moderne care sunt supuse schimbărilor continue și viteza de implementare este o problemă principală.
Baze de date NoSQL de tip familie de coloane
Coloana reprezintă elementul principal al bazelor de date NoSQL de tip familie de coloane. Ea este o pereche de baze de date de tip cheie-valoare și este alcătuită din trei elemente: nume unic, valoare și timestamp – timestamp-ul reprezintă un sistem folosit pentru determinarea validității conținutului. În conformitate cu teorema CAP, bazele de date NoSQL nu dețin toate cele trei caracteristici simultan, prin urmare bazele de date NoSQL de tip familie de coloane va folosi timestamp-ul pentru a afla care dintre valorile stocate în nodurile de rezervă sunt valide. În bazele de date relaționale, coloana este parte dintr-un tabel. Acest lucru nu există la bazele de date NoSQL de tip familie de coloane, unde conceptul de tabel este vag. O coloană poate fi inclusă într-o familie de coloane și poate apărea într-un rând iar în celelalte nu. De asemenea, numărul de coloane se poate modifica de la rând la rând.
Bazele de date NoSQL au scheme de date elastice dar slab tipizate, ele pot fi proiectate pentru scalarea orizontală, respectând regulile teoremei CAP. Consistența și disponibilitatea se găsesc împreună în HBase, Hypertable, MongoDB etc. Disponibilitatea și partiționabilitatea sunt îmbinate corect în sistemul Cassandra. Sistemele care folosesc baze de date NoSQL asigură păstrarea datelor atât în memoria internă cât și în cea externă. Pentru păstrarea datelor sunt eficiente sistemele:
bazate pe memorie (ex. Redis, Scalaris, Terrastore);
bazate pe disc (ex. MongoDB, Riak etc.);
bazate pe o combinație de memorie și disc (ex. HBase, Hypertable, Cassandra);
Sistemele asigura persistența datelor in memoria interna si externa.
Exemple de persistența datelor :
bazată pe memorie (ex. Redis, Scalaris, Terrastore),
bazată pe disc (ex. MongoDB, Riak etc.),
bazată pe o combinație de memorie și disc (ex. HBase, Hypertable, Cassandra);
Suportă diferite interfețe NoSQL pentru accesul la date.
Exemple de interfețe : REST (HBase, CouchDB, Riak etc.), MapReduce (HBase, CouchDB, MongoDB, Hypertable etc.), Get/Put (Voldemort, Scalaris etc.), Thrift (HBase, Hypertable, Cassandra etc.), limbaje specifice ale API-urilor (MongoDB).
Realizarea aplicațiilor cu baze de date NoSQL
Sistem de baze de date NoSQL (Not only SQL) = sistem de baze de date care este distribuit, ar putea să nu necesite scheme fixe pentru tabele, evită de obicei operațiile de tip join, este în mod tipic scalabil pe orizontală, nu pune la dispoziție o interfață de interogare SQL și în multe cazuri este open source. Uneori termenul este folosit cu sensul de sistem complet nerelațional. Tranzacțiile în SBD NoSQL nu îndeplinesc cerințele ACID (Atomic, Consistent, Izolat și Durabil) specifice SBD relaționale. Pentru acest tip de baze de date tranzacțiile trebuie să fie BASE (Basically Available, Soft state, Eventual consistency). Sistemul garantează disponibilitatea datelor așa cum este ea definită în teorema CAP. Oricare cerere va primi un răspuns. Dar, spre deosebire de SBD relaționale, răspunsul poate fi și afirmarea incapacității temporare de a furniza datele cerute – datele pot fi la momentul respectiv într-o stare inconsitență sau în curs de modificare. Stare labilă se referă la starea sistemului care se poate schimba chiar în perioadele în care nu se fac scrieri de date, lucru datorat mecanismelor specifice consistenței “în cele din urmă”. Consitență în cele din urmă- Sistemul va deveni cu siguranță consistent după un interval în care nu mai au loc operații de scriere. Datele se vor propaga mai devreme sau mai târziu în toate punctele în care ar trebui să se propage, dar sistemul va continua să primească operații de scriere și nu va verifica pentru consistență la fiecare tranzacție înainte de a trece la următoarea tranzacție (așa cum se face în SBD relaționale).
În funcție de modul în care sunt structurate datele, sistemele cu baze de date NoSQL pot fi clasificate în următoarele categorii:
Document stores (acumulări de documente) – MongoDB, CouchDB, Couchbase, Marklogic, RavenDB, Cloudant, Gemfire, OrientDB, Rethink DB, Datameer;
Key-value Stores (acumulări cheie-valoare) – Redis, Memcached, Riak, DynamoDB, Ehcache, Hazelcast, Berkeley DB, Simple DB, Coherence, Oracle NoSQL;
Wide-column stores (acumulări de câmpuri de dimensiuni mari) – Cassandra, Hbase, Accumulo, Hypertable, Sqrrl;
Alte categorii de baze de date NoSQL cu utilizare de nișă: RDF stores (acumulări de informații Resource Description Framework), baze de date graf, baze de date pentru motoare de căutare, baze de date multivaloare, baze de date native XML, baze de date de evenimente, baze de date de conținut, baze de date de navigație etc.
Unele dintre sistemele de baze de date NoSQL reprezintă soluții găsite pentru stocarea datelor în aplicațiile care implică volume foarte mari de tranzacții atât de citire cât și de scriere. Tranzacțiile pot implica la rândul lor date de dimensiuni mari. În această situație sunt serviciile web pe scară mare – cum ar fi Google, Amazon, Facebook, Yahoo, Youtube, Instagram, eBay și altele asemănătoare. Similar se comporta și unele aplicații comerciale, științifice sau militare – ex. aplicațiile companiilor Walmart, FICO Falcon Credit Card Fraud Detection System sau Windermere Real Estate. Volumul mare de date face dificilă sau chiar imposibilă prelucrarea acestor date cu aplicații tradiționale. Termenul utilizat în mod curent pentru datele având aceste caracteristici este Big Data.
Alegerea sistemului de baze de date NoSQL utilizat
Pentru alegerea sistemului de baze de date NoSQL avem trei posibilități: Document Store, Key-Value Store și Wide-column Store. Sistemul de baze de date NoSQL se alege în funcție de cerințele aplicației. Fiecare sistem deține proprietățile lui precum:
Se dorește organizarea datelor fără o schemă generală;
Tipurile valorilor din „câmpurile” individuale pot fi diferite de la o „înregistrare” la alta;
Un „câmp” poate avea mai multe valori (vector);
„Înregistrările” pot avea o structură imbricată (înregistrare în înregistrare în înregistrare …).
Structură foarte simplă – diverse valori sunt stocate împreună cu o cheie de căutare;
Nu sunt adecvate pentru aplicații complexe;
Potrivite pentru sisteme embedded;
Potrivite pentru subsisteme de mare viteză;
Fiecare „înregistrare” poate conține un număr foarte mare de „câmpuri” (milioane, miliarde) a căror dimensiune și denumire poate fi schimbată în mod dinamic.
În general, pentru aplicațiile economice care necesită utilizarea unei soluții NoSQL, sistemele de baze de date de tip document store sunt cele mai potrivite. Cel mai popular sistem de tip document store este MongoDB – locul 1 în DB-Engines Ranking of Document Stores, locul 3 în DB-Engines Open Source Ranking și respectiv locul 5 în DB-Engines Complete Ranking – http://db-engines.com (în urcare de pe locul 7 în iunie 2013 și respectiv 6 în ianuarie 2014). Cel mai popular sistem de tip key-value store este Redis – locul 1 în DB-Engines Ranking of Key-value Stores și respectiv locul 12 în DB-Engines Complete Ranking. Cel mai popular sistem de tip wide column store este Cassandra – locul 1 în DB-Engines Ranking of Wide Column Stores și respectiv locul 10 în DB-Engines Complete Ranking.
MongoDB
Pentru realizarea aplicației am ales să lucrez cu MongoDB. MongoDB este o baza de date open-source care oferă performanță înaltă, scalabilitate înaltă și scalabilitate usoară.
Caracteristicile MongoDB:
Lansat de 10gen în 2009;
Open source – licență AGPL versiunea 3; este de asemenea disponibilă o licență comercială;
Serverul MongoDB poate fi instalat pe sisteme de operare Windows, Linux, OS X și Solaris;
Tipuri de date predefinite: string, integer, double, boolean, date, object id;
Limbaje de programare suportate prin driveri oficiali: C, C#, C++, Erlang, Haskell, Java, JavaScript, Perl, PHP, Python, Ruby, Scala;
Limbaje de programare suportate prin driveri neoficiali: Actionscript, Clojure, ColdFusion, D, Dart, Delphi, Go, Groovy, Lisp, Lua, MatLab, PowerShell, Prolog, R, Smalltalk;
Scriptare server-side prin JavaScript;
Partiționare prin sharding;
Replicare de tip master-slave;
Suportă MapReduce (agregare și prelucrare de date flexibile);
Atomicitate: posibilă în operațiile cu un singur document;
Consistență: selectabilă, până la nivel de operație de scriere individuală, între consistență imediată și consistență „în cele din urmă”;
Izolare: suportă manipularea concurentă a datelor;
Durabilitate: opțională;
Securitate: pot fi definiți utilizatori cu drepturi de acces complete sau read-only.
Implementările MongoDB găzduiesc mai multe baze de date. Bazele de date dețin mai seturi de colecții. Colecțiile conțin mai multe seturi de documente. Documentele sunt alcătuite din mai multe perechi de date de tip key-value. Documentele au o schemă dinamică adică documentele din aceeași colecție nu au nevoie sa aibă aceeași structură și câmpurile comune dintr-o colecție de documente pot suporta diferite tipuri de date. Caracteristicile principale ale sistemului MongoDB sunt:
Flexibilitatea- Schemele dinamice ajută la procesul de evoluție al datelor;
Puterea- Se referă la interogările dinamice, sortări, actualizări și agregare ușoară;
Rapiditatea- Interogările sunt rapide;
Ușor de folosit- MongoDB este ușor de instalat, ușor de configurat și ușor de folosit;
MongoDB vine cu o serie de operații precum: insert- inserează un document într-o colecție, find- selectează documente din colecții, findOne- caută un singur obiect, update- actualizează, save- realizează o actualizare care o înlocuiește documentul precedent și delete- șterge documente dintr-o colecție.
Operatori MongoDB:
Fig Organizarea datelor MongoDB
MongoDB se bazează pe modelul de date de tip document, iar seturile mari de date pot fi partiționate pe mai multe calculatoare. Scriere codurilor se face mult mai ușor și mai rapid. Am folosit acest sistem de baze de date deoarece oferă caracteristici importante și puternice pentru relizarea unei baze de date performante.
Bazele de date NoSQL fac parte din categoria sistemelor de gestionare a bazelor de date care nu folosesc modelul relațional. Sisteme NoSql au la baza: MapReduce, Key-Value Stores, Document-stores și bazele de date de tip graf. Bazele de date NoSQL sunt făcute pentru aplicațiile de înaltă performanța și au ca si caracteristici: scalabilitatea, disponibilitatea și toleranța la partiționare.
Implementarea unei aplicații software folosind baze de date NoSQL
Componentele software folosite
În realizarea aplicației a fost folosit mediul de programare Microsoft Visual Studio și MongoDB.
Implementarea propusă se bazează pe IDE-ul Microsoft Visual C# – poate fi folosită oricare dintre versiunile 2008, 2010 și 2012 și oricare dintre edițiile acestora (de la cea gratuită, Express Edition până la cea mai complexă, Ultimate Edition). Necesarul de resurse hardware pentru calculator este dictat de versiunea / ediția de Visual C# folosită. Driver C# pentru MongoDB a fost downloadat de pe următorul site: https://github.com/mongodb/mongo-csharp-driver/releases. Sistemul de baze de date MongoDB solicită pentru execuție sisteme de calcul little-endian (procesoare de clasă x86 / x86_64). Cantitatea de memorie RAM și de spațiu de stocare nu sunt limitate. Pentru baze de date de 500MB sau mai mari, sistemul de operare și sistemul de baze de date MongoDB trebuie să fie pe 64 de biți.
Pentru dezvoltarea aplicației se instalează sistemul de baze de date MongoDB. Acesta se poate instala pe același sistem de calcul cu aplicația. Secvențele de cod din această prezentare sunt valabile pentru versiunea 2.6.5 a MongoDB și versiunea 1.9.2 a driverului C#. Unele metode și proprietăți nu sunt valabile în versiuni mai vechi. După instalarea sistemului, se creează un folder numit data iar în interiorul acestuia alt folder numit db. Aceste două fisiere vor reprezenta locația unde vor fi stocate datele.
Pasul următor consta în notarea adresei URL sau IP a calculatorului pe care a fost instalat sistemul MongoDB, apoi se instalează driverul C#. Se notează calea pe care s-a făcut instalarea – implicit C: \ Program Files \ MongoDB \ CSharpDriver 1.9.2 pentru sistemul de operare Windows pe 32 de biți (versiunea curent disponibilă de driver este 1.9.2). Driverul este de fapt un driver generic de .Net astfel încât poate fi folosit și în aplicații Microsoft Visual Basic sau Microsoft Visual F#. După efectuarea acestor pași se deschide mediul de programare Microsoft Visual C# și se creează un proiect nou. La lista de referințe a proiectului nou creat se vor adăuga referințe către cele două librării ale driverul C# – MongoDB.Bson.dll și MongoDB.Driver.dll. Aceste fișiere pot fi găsite la locația notată la instalarea driverului C#:
Pentru conectarea la sistemul de date MongoDB, în codul fiecărei forme se adaugă la declarațiile deja existente declarațiile de librării. Trebuie declarate cel puțin librăriile MongoDB.Bson și MongoDB.Driver :
În funcție de cerințele proiectului se mai pot adăuga, la declarațiile utilizărilor celor două librării de bază, în codul formelor dorite diferite sub-librării precum:
MongoDB.Driver.Builders, MongoDB.Driver.Communication, MongoDB.Driver.GeoJsonObjectModel, MongoDB.Driver.GridFS, MongoDB.Driver.Internal, MongoDB.Driver.Linq, MongoDB.Driver.Wrappers;
MongoDB.Bson.IO, MongoDB.Bson.Serialization, MongoDB.Bson.Serialization.Attributes, MongoDB.Bson.Serialization.Conventions, MongoDB.Bson.Serialization.IdGenerators, MongoDB.Bson.Serialization.Options, MongoDB.Bson.Serialization.Serializers;
Următorul pas constă în verificarea funcționalității sistemului de baze de date MongoDB prin pornirea serverului:
Interacțiunea între aplicație și baza de date
Pentru interacțiunea dintre aplicație si baza de date se realizează conectarea la serverul MangoDB. Conexiunea String este cea mai simplă modalitate de conectare la o baza de date MongoDB:
var connectionString = "mongodb://localhost/";
try
{
var client = new MongoClient(connectionString); //inițializare client
var server = client.GetServer(); //obținere conexiune server
//aici operatii de citire, scriere etc. efectuate dupa conecta
MessageBox.Show("Conectare la server reusita!!!", "Confirmare …", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (MongoConnectionException eroare)
{ MessageBox.Show("Nu m-am putut conecta la server.\r\nDescrierea erorii: " +
eroare.Message, "Eroare …", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
La stringul de conexiune de mai sus pot fi adăugate anumite opțiuni și modificatori pentru un control mai bun al modului în care aplicația accesează sistemul MongoDB precum:
mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
mongodb:// – Este prefix obligatoriu;
usaername:password@ – Opțional. Furnizează credențiale pentru identificarea clientului;
host1 – Obligatoriu. Identifică serverul la care se face conectarea. Poate fi un hostname, adresă IP;
:port1 – Opțional. Daca nu se specifică, este utilizată valoarea implicită :27017;
hostX – Opțional. Pot fi specificate oricâte hosturi. Utilizarea mai multor adrese de host se face în cazul în care serverul este replicat pe mai multe sisteme;
:portX – Opțional. Daca nu se specifică, este utilizată valoarea implicită :27017;
/database – Opțional. Numele bazei de date pe care se va face verificarea credențialelor. Dacă nu se specifică baza de date, verificarea credențialelor se va face pe baza de date admin
?options – Opțional. Opțiuni suplimentare.
O metodă pentru folosirea credențialelor mai multor utilizatori este specificarea lor într-o variabilă de tip MongoCredential:
var credentiale = MongoCredential.CreateMongoCRCredential("test", "user1", "password1");
//credențiale noi – baza de date, username, password
var settings = new MongoClientSettings //setări noi pe baza credențialelor
{
Credentials = new[] { credentiale }
};
var client = new MongoClient(connectionString); //inițializare client
var server = client.GetServer(); //obținere conexiune server
O altă metodă de autentificare este metoda SSL. Driverul C# acceptă conexiuni SSL la serverul MongoDB utilizând suportul de bază oferit de platforma .NET. Configurarea SSL se poate configura utilizând conexiunea String.
MongoDB și aplicația interacționează și pentru pornirea si oprirea serverului bazei de date. În cazul în care serverul MongoDB nu este pornit, el poate fi pornit din interiorul aplicației. Pentru pornirea serverului din interiorul aplicației este necesară parcurgerea următorilor pași:
Se adaugă la aplicație declararea utilizării unei biblioteci de diagnostic:
using System.Diagnostics;
Se pornește din aplicație un nou proces corespunzător serverului MongoDB dorit:
Process p = new Process(); //se declară un nou proces
p.StartInfo.WorkingDirectory = Path.GetDirectoryName
(@"D:\Program Files\MongoDB 2.6 Standard\bin\mongod.exe");
//folderul de lucru al procesului
p.StartInfo.FileName = @"D:\Program Files\MongoDB 2.6 Standard\bin\mongod.exe";
//calea către fișierul executabil
p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; //fereastră minimizată
p.StartInfo.Arguments = ""; //fără argumente suplimentare
p.Start(); //pornire proces
În cazul în care se oprirea serverului din interiorul aplicației, acest lucru se face cu ajutorul următoarei secvențe de cod:
var connectionString = "mongodb://localhost/";
try
{
var client = new MongoClient(connectionString); //inițializare client
var server = client.GetServer(); //obținere conexiune server
server.Shutdown(); //oprire server
}
catch (MongoConnectionException eroare)
{
MessageBox.Show("Nu m-am putut conecta la server.\r\nDescrierea erorii: " + eroare.Message, "Eroare …", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Proiectarea aplicației
Implementarea aplicației
Utilizarea aplicației
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Mediul de Programare Visual Studio (ID: 150024)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
