Prezentarea Generala a Sistemului de Evidenta Carti Si Cititori Intr O Biblioteca Scolara

Odată cu dezvoltarea tehnologiei și datorită apariției calculatoarelor, oamenii tind să nu mai respecte valorile și obiceiurile consacrate, cum ar fi : vizionarea unui film la cinematogaf, a unei piese de teatru sau a unui concert, preferând din comoditate, să utilizeze calculatorul în scopul înlocuirii activităților pe care le-ar putea întreprinde.

Prin multitudinea opțiunilor și serviciilor oferite, calculatorul dobâdește un rol extrem de important în viața noastră atât pe plan personal, cât și profesional. Astfel din ce în ce mai multe domenii se bazează pe utilizarea acestora, pentru a obține o eficiență cât mai bună și pentru a ușura considerabil munca omului în anumite activități. Biblioteca reprezintă una din principalele surse de îmbogățire spirituală și culturală pentru cei ce sunt interesați și pasionați de anumite domenii, sau poate fi și doar o simplă sursă de informație pentru anumite persoane, care fortate de împrejurări, sunt nevoite să apeleze la serviciile unei biblioteci.

Activitatea într-o bibliotecă presupune o foarte bună organizare și administrare a tuturor elementelor sale, cu scopul de a satisface cerințele cititorilor într-un timp cât mai scurt și în mod normal cât mai eficient.

PREZENTAREA GENERALA A SISTEMULUI DE EVIDENTA CĂRȚI ȘI CITITORI ÎNTR-O BIBLIOTECĂ ȘCOLARĂ

1.1. MOTIVAȚIA APLICAȚIEI

Volumul mare de informații existente în cazul unei biblioteci cu un număr mare de cărți și cititori determină necesitatea informatizării domeniului de gestiune a activităților unei biblioteci.

Activitatea de evidență a unei biblioteci implică o muncă intensă cu numeroase documente care țin de înregistrarea cititorilor, a cărților împrumutate de aceștia, de prelucrare a datelor acestora și de înregistrare permanentă a împrumuturilor și returnărilor efectuate, într-un timp cât mai scurt. Prin informatizarea domeniului de evidență a unei biblioteci se câștigă timp și se evită pierderea unor date, nefiind necesară consultarea unui număr mare de documente ce țin de gestionarea activităților unei biblioteci. Se obțin astfel mult mai ușor informații despre cititori, despre cărțile împrumutate și datele de returnare, și alte date.

Biblioteca școlară este compartimentul specializat al cărui scop principal este de a constitui, a organiza, a prelucra, a dezvolta și a conserva colecții de cărți, publicații periodice, alte documente specifice și baze de date, pentru a facilita utilizarea acestora de către beneficiari în scop de informare, cercetare, educație sau recreere.

Biblioteca școlii este parte integrantă a procesului de instruire, formare și educare, este organizată în cadrul unei instituții de învățământ preșcolar și gimnazial și se află cu precădere în serviciul elevilor și al cadrelor didactice din instituția menționată.

Misiunea bibliotecii școlare este de a asigura elevilor și cadrelor didactice accesul la informație și documentație, de a susține procesul intructiv-educativ, de a participa la dezvoltarea competențelor cheie ale elevilor.

1.2. PREZENTAREA ACTIVITĂȚII DESFĂȘURATE ÎNTR- O BIBLIOTECĂ ȘCOLARĂ

„Biblioteca școlară oferă informații și idei esențiale pentru funcționarea, cu succes, a societății informaționale de astăzi, bazată pe cunoaștere.

Biblioteca școlară formează, la elevi, abilități de studiu pentru toată viața, dezvoltându-le imaginația, oferindu-le posibilitatea să trăiască ca cetățeni responsabili.

Biblioteca școlară oferă servicii de studiu, cărți și documente care permit tuturor membrilor comunității școlare să gândească în mod critic și să devină utilizatori efectivi de informație, în orice format și media.

Serviciile bibliotecii școlare trebuie asigurate, în egală măsură, pentru toți membrii comunității școlare, indiferent de vârstă, rasă, sex, religie, naționalitate, limbă, statut profesional sau social. Servicii și materiale speciale trebuie asigurate și pentru persoanele care nu pot folosi serviciile și materialele curente ale bibliotecii.

Accesul la serviciile și colecțiile bibliotecii școlare se bazează pe Declarația Universală a Drepturilor și Libertăților Omului și nu trebuie să fie obiectul niciunei forme de cenzură ideologică, politică sau religioasă, și nici al unor presiuni comerciale.

Biblioteca școlară este un partener important în rețeaua biblioteconomică și informațională locală, regională și națională.”

(Extras din Manifestul IFLA/UNESCO pentru Bibliotecile școlare, 2005)

În urma analizei modului de stocare a informațiilor despre împrumutul și respectiv restituirea cărților împrumutate de elevii școlii am constatat că este necesară crearea unei baze de date care să permită accesarea mai rapidă a informațiilor și obținerea mai multor situații cerute de conducerea școlii.

De aceea am ales să realizez un sistem informatic care să ajute utilizatorul să gestioneze mult mai ușor cărțile și să țină evidența cititorilor dintr-o bibliotecă.

Acest program va ușura munca bibliotecarului, acesta confruntându-se cu un număr mare de cărți, autori, împrumuturi, restituiri, adăugiri și eliminări de cărți/cititor din bibliotecă. El poate fi folosit de orice bibliotecă și de orice funcționar al școlii al cărei sarcină se potrivește cu tema aleasă.

Programul a fost gândit pentru a putea da curs tuturor operațiilor în lucrul cu cititorii și cărțile unei biblioteci. A fost conceput pentru a fi cât mai facil în utilizarea astfel chiar și novicii în arta calculatoarelor vor putea folosi acest program.

Meniul principal al programului oferă următoarele posibilități :

Adauga Carte

Adauga Cititor

afișarea datelor personale ale cititorului(Lista Cititori)

afișarea tuturor cărților aparținând bibliotecii(Lista Carti)

afișarea tuturor cărților împrumutate de cititori(Carti Nereturnate)

afișarea tututror cărților restante(Carti Restante)

1.2.1. CONDIȚII DE ÎNSCRIERE

Înscrierea la biblioteca școlară este gratuită. Biblioteca noastră primește toți elevii, toate cadrele didactice – de predare și auxiliare-, personalul nedidactic, oferind un acces egal la informație fiecărui cititor/utilizator, asigurând un acces comod și economic la cultura scrisă, nediscriminând pe nici unul, indiferent de sex, religie sau mediul de proveniență, indiferent de gradul de inteligență. Înscrierile se fac pe baza B.I./C.I. și a tabelelor nominale/clase, întocmite de învățători și diriginți.

1.2.2. CONDIȚII DE ÎMPRUMUT

Împrumutul publicațiilor se face individual de către bibliotecar prin accesarea aplicației ”Biblioteca”. Cititorii pot împrumuta maxim trei cărți, pe o perioadă de 15 zile, beneficiind de o prelungire de până la 15 zile.

Distrugerea sau pierderea documentelor, bunurilor culturale comune, de către utilizatori sau nerestituirea la termen se sancționează prin recuperarea fizică a unor documente identice sau prin achitarea valorii de inventar a documentelor, actualizată cu aplicarea coeficientului de inflație la zi – la care se adaugă o sumă echivalentă cu de până la 5 ori față de prețul astfel calculat – în conformitate cu prevederile din Anexa la OMEdC nr.4626/21 iulie 2005 – Metodologia de recuperare a documentelor pierdute, distruse ori deteriorate și de taxare a serviciilor și a nerespectării termenelor de restituire a publicațiilor împrumutate din bibliotecile cuprinse în rețeaua învățămîntului.

RESTRICȚII DE INTEGRITATE :

Integritatea datelor presupune :

integritate de entitate(asigurată prin definirea unei chei primare pentru fiecare tabelă de sine stătătoare);

integritate referențială(asigurată prin relizarea legăturilor respectând dependențele logice și dependențele funcționale din sistem).

Pentru sistemul informațional ales se vor respecta următoarele restricții de integritate:

aceeași carte nu poate fi împrumutată de mai mulți cititori în același timp, pentru că fiecare carte este înregistrată în baza de date în mod unic;

fiecare cititor are dreptul să împrumute de la 1- 3 cărți, pe o perioadă determinată, cu posibilitate de prelungire a perioadei respective;

aplicația software va permite împrumutarea unei cărți dacă cititorul nu a depășit numărul zilelor de împrumut pentru o carte;

bibliotecarul are dreptul de a șterge un cititor din baza de date, dacă acesta pierde statutul de cititor(depășeșete numărul zilelor de împrumut pentru o carte);

aplicația păstrează cititorii ”șterși” din baza de date în Lista Cititori ”Expirati”, un cititor devenind activ prin returnarea cărților împrumutate.

2. BAZE DE DATE : NOȚIUNI INTRODUCTIVE

2.1. ORGANIZAREA DATELOR

”Din necesitatea stocării și prelucrării cât mai rapide a informațiilor au apărut calculatoarele personale. Creștere substanțială a capacității de memorare și a vitezei de prelucrare a datelor este determinară de evoluția tehnicii de calcul. Din punctul de vedere a celor doi parametrii, problemele rezolvate cu ajutorul calculatorului pot fi clasificate în: probleme care implică prelucrări reduse asupra unui volum mare de date;

probleme care implică un volum mediu de prelucrări asupra unui volum mediu de date;

probleme care implică un volum mare de prelucrări asupra unui volum mic de date;

Sisteme informatice specializate în stocarea și prelucrarea unui volum mare de date sunt sistemele de gestiune a bazelor de date.

Un loc important în proiectarea sistemelor informatice îl reprezintă organizarea datelor, de ea depinzând eficiența sistemului informatic. Organizarea datelor implică :

definirea, structurarea, ordonarea și gruparea datelor în colecții omogene de date ; stabilirea legăturilor (relațiilor) între date, între elementele unei colecții de date, respectiv între colecții de date; reprezentarea datelor pe un suport informațional prelucrabil intr-un sistem de calcul.

În afara cerințele legate de timpul de acces la date și spațiul de memorie, organizarea datelor urmărește realizarea unicității datelor.”

. CONCEPTE UTILIZATE ÎN ORGANIZAREA DATELOR

”În literatura de specialitate, o dată cu apariția bazelor de date s –au introdus conceptele de bază : entitate, atribut, valoare.

Aceste trei concepte sunt legate între ele. Entitatea reprezintă un obiect concret sau abstract reprezentat prin proprietățile sale. Proprietate unui obiect poate fi exprimată printr-o pereche de tipuri atribut – valoare. În concluzie, entitățile se pot exprima printr-o mulțime de perechi.

Exemplu de entitate : (persoană /nume: Ionescu, vârsta: 22, adresa…).

Mulțimea unor atribute se poate uneori asocia mai multor entități. Astfel atributele din exemplul anterior, nume, vârstă pot fii caracteristice în general oricărei persoane, deci atributul este caracteristic unei clase de entități, nu doar unei entități, numită și entitate grup. Elementele unor entități grup cu aceleași atribute sunt de același tip, de aici denumirea de tip de entități pentru clase de entități.

Sub denumirea de câmp sau caracteristică este cunoscută noțiunea de atribut . Atributul este caracterizat de natura valorii sale. Dacă valoarea sa este numerică, atributul are tipul numeric.

Un alt concept este cel de dată. Un model de organizare a informației reprezintă data. Data elementară este o dată indivizibilă în raport cu informația pe care o reprezintă, dar și în raport cu modul de prelucrare. O dată compusă este formată din mai multe date elementare. Din punct de vedere logic data poate fi definită prin identificator, atribut și valoare. Din punct de vedere fizic, datei îi corespunde o zonă de memorie de o anumită mărime, situată la o adresă absolută.”

2.3. STRUCTURI DE DATE

”Structurile de date sunt colecții de date între care s-au stabilit o serie de relații care conduc la un mecanism de selecție și identificare a componentelor. Mulțimea de date asociată structurii poate conține date de același tip sau de mai multe tipuri. Localizarea componentelor structurii poate fi făcută fie prin nume identificator, fie prin poziția ocupată în structură. Dac localizarea se face prin parcurgerea componentelor aflate înaintea sa în ordinea specificată, atunci accesul este secvențial. Dacă o componentă poate fi selectată fără a ține seama de celelalte componente, atunci structura are un acces direct. Componentele unei structuri de date pot fi simple sau chiar structuri de date. Asupra unei structuri de date pot fi efectuate o mulțime de operații, cele mai importante fiind:

Crearea și memorarea datelor în forma inițiala pe suport magnetic

Consultarea (accesul) la componentele structurii în vederea prelucrării informațiilor

– Actualizarea (schimbarea) structurii prin adăugarea sau ștergerea unor elemente, modificarea valorii unor elemente, modificarea relațiilor dintre ele.

Sortarea (aranjarea elementelor unei structuri după anumite criterii)

Ventilarea (spargerea structurii de date în două sau mai multe structuri)

Copierea

Toate structurile de date care au aceeași structură și sunt supuse acelorași operații, formează un tip de structură de date.”

2.4. BAZE DE DATE

Conceptul de baze de date a apărut în anul 1969, cu ocazia prezentării primului raport CODASYL într-o conferință pe probleme de limbaje de gestiune a datelor. Ideea principală constă în existența unui fișier de descriere globală a datelor. Conceptul a fost ulterior dezvoltat și s-a ajuns la următoarele tipuri de baze de date :

Baze de date rețea (distribuite)

Baze de date relaționale

Baze de date orientate pe obiecte

În esență, conceptul de bază de date se definește ca una sau mai multe colecții de date în interdependență, împreună cu descrierea datelor și a relațiilor dintre ele. O bază de date trebuie să îndeplinească următoarele condiții:

– a) Să asigure o interdependență sporită a datelor față de program și invers

b) Conceperea structurii bazei de date trebuie să se facă astfel încât să asigure informații necesare și suficiente pentru cerințele de informare și decizie

c) Să asigure o redundanță minimă (redundanță = ceva care se repetă)

d) Să permită accesul rapid la informațiile stocate în baza de date

Bazele de date sunt extrem de variate. Arhitectura bazelor de date evidențiază structura acestora și este standardizată. Arhitectura generală cuprinde următoarele elemente:

baza de date propriu-zisă, în care se memorează colecția de date

sistemul de gestiune a bazei de date, acesta fiind un ansamblu de programe care realizează gestiunea și prelucrarea complexă a datelor

un dicționar al bazei de date (metabaza de date) care conține informații despre date, structura acestora, elemente de descriere a semanticii, etc.

2.5. SISTEME DE GESTIUNE A BAZELOR DE DATE (SGBD)

Data Base Management System – DBMS în engleză. Un sistem de gestiune a bazelor de date asigură realizarea următoarelor activități:

Definirea structurii bazei de date

Încărcarea datelor în baza de date

Accesul la date (interogare, actualizare)

Întreținerea bazei de date

Reorganizarea bazei de date

Securitatea datelor

Deci un sistem de gestiune a bazelor de date este un sistem complex de programe care asigură interfața între o bază de date și utilizatorii acestuia. În vederea satisfacerii obiectivelor informaticii (culegerea, verificarea, transmiterea, stocarea și prelucrarea automată a datelor), precum și a cerințelor impuse de nevoia de informare eficientă, un SGBD trebuie să îndeplinească mai multe obiective :

Asigurarea independenței datelor

Asigurarea unei redundanțe minime

Asigurarea unor facilități sporite de utilizare a datelor

Sporirea gradului de securitate a datelor

Asigurarea partajabilității datelor

In scopul realizării acestor obiective, un sistem de gestiune a bazelor de date asigură realizarea mai multor operații grupate pe funcții. Funcțiile sistemelor de gestiune a bazelor de date sunt următoarele :

Funcția de descriere a datelor – permite definirea bazelor de date cu ajutorul unui limbaj de definire. Definirea se poate realiza la un nivel logic, conceptual și fizic. La nivelul acestei funcții se descriu multitudinea atributelor (câmpurilor), a relațiilor dintre entități sau atributele entităților și eventual criterii de validare a datelor. Rezultatele acestei funcții se concretizează în schema bazei de date memorate în cod intern

Funcția de manipulare a datelor – este cea mai complexă, aceasta cuprinzând pe lângă elementele de creare a bazei de date și elementele de adugare, ștergere a înregistrărilor, modificarea valorilor, căutare, sortare, editare înregistrări, etc. Aceasta se realizează prin intermediul unui limbaj de manipulare a datelor.

Funcția de utilizare asigură mulțimea interfețelor necesare pentru comunicarea tuturor utilizatorilor cu baza de date.

Funcția de administrare a bazelor de date este de competența administratorilor de baze de date, care se ocupă de rezolvarea problemelor care apar și de integritatea datelor.

În domeniul bazelor de date, modelul relațional ocupă un loc central, sistemul de gestiune a bazelor de date relaționale dominând de mult vreme lumea bazelor de date.

3. MODELE DE REPREZENTARE A DATELOR ÎN BAZELE DE DATE

3.1. MODELE DE DATE: REȚEA, IERARHICE, RELAȚIONALE, OBIECTUALE

Înaintea construirii unei baze de date este necesară elaborarea unui model de date utilizat pentru reprezentarea datelor. Un astfel de model se dovedește a fi de mare ajutor la înțelegerea datelor și la luarea celor mai bune decizii de proiectare în cadrul modelului fizic.

Un model este o abstractizare și o structură ce simbolizează toate caracteristicile entităților esențiale ce prezintă interes pentru utilizator, o reprezentare și o reflectare a lumii reale (Universul Discursului).

Un model de date reprezintă o colecție integrată de concepte necesare descrierii datelor, relațiilor dintre ele, precum și a constrângerilor asupra datelor (Connolly ș.a. 1998). Modelul de date este utilizat la descrierea schemei bazei de date, definind structura datelor, legăturile dintre acestea, semantica lor, precum și constrângerile impuse, deși nu este obligatoriu ca întotdeauna acestea să fie regăsite în orice model de date. Pe scurt, un model de date este utilizat pentru a reprezenta date despre date.

Modelele de date oferă înțelegerea descriptivă necesară definirii schemelor logice și externe și sunt utile descrierii formale a schemei bazei de date.

Schema logică a unei baze de date reprezintă o descriere abstractă a unei porțiuni din realitatea modelată împreună cu instanțele bazei de date.

Un model de date este alcătuit din trei elemente de bază:

entități;

atribute;

relații.

O entitate reprezintă un obiect sau concept din lumea reală, cum ar fi de exemplu un student sau un curs descris în cadrul bazei de date.

Un atribut reprezintă acele caracteristici ce descriu aspecte sau condiții ale unei entități, cum ar fi de exemplu numele studentului sau situația acestuia.

Relația stabilită între două sau mai multe entități reprezintă o interacțiune între acele entități, cum ar fi de exemplu asocierea dintre un student și cursul pe care îl urmează.

Așa cum arătau Elmasri și Navathe, modelele de date ajută la înțelegerea datelor “asociate logic”.

3.1.1. Istoricul bazelor de date

În continuare se vor prezenta câteva dintre cele mai importante evenimente petrecute pe parcursul dezvoltării bazelor de date.

În anul 1961 Charles Bachman proiectează Integrated Data Store (IDS) – predecesorul modelului rețea.

Spre sfârșitul anilor ’60, IBM creează “Information Management System: IMS” bazat pe modelul ierarhic.

Spre sfârșitul anilor ’60, grupul CODASYL (Committee for Data System Languages) definește /standardizează modelul rețea.

În 1969 Edgar Codd cercetător la firma IBM construiește modelul relațional.

În ani ’70 apar SEQUEL (SQL), QBE; QUEL, System R (DB2), Ingres.

În anul 1976, Peter Chen construiește modelul Entitate-Relație.

În anii ’80 apar sistemele de gestiune a bazelor de date printre care: DB2, Oracle, Sybase, Informix, DBase, Paradox.

În anul 1986 a fost definit primul standard SQL.

Între anii 1990 și 2000 apar concepte precum OODB, ORDB (Postgres), Data Warehouse, OLAP, Data Mining, GIS, Mobile DB, Multimedia DB, Web DB, XML DB.

Inabilitatea bazelor de date de a lucra eficient în cadrul fișierelor obișnuite cu date ce implică utilizarea grupurilor repetitive de date a condus la dezvoltarea unei mari varietăți de structuri de baze de date, numite de obicei și modele de baze de date.

3.1.2. Funcțiile modelelor

Funcțiile modelelor sunt:

Reprezintă obiecte, evenimente precum și asocierile dintre acestea.

Reprezintă aspecte esențiale și inerente, ignorând proprietățile accidentale.

Au în vedere ansamblul entităților, atributelor și relațiilor dintre acestea.

Asigură regulile de bază și relațiile ce permit proiectanților și utilizatorilor să comunice corect, fără ambiguități.

Un model de date este alcătuit din următoarele componente:

Partea structurală ce reprezintă un set de reguli ce fundamentează baza de date.

Partea de manipulare ce definește tipurile de operații ce se pot efectua în baza de date:

operații utilizate pentru actualizarea sau regăsirea datelor;

operații utilizate pentru modificarea structurii bazei de date.

Set de reguli de integritate ce garantează faptul că datele sunt corecte.

Există trei modele de baze de date:

Modelul de date extern utilizat pentru a reprezenta vederea fiecărui utilizator, care mai este cunoscut și sub denumirea de Univers al Discursului. Acest model este reprezentat prin modelele de date bazate pe înregistrări.

Modelul de date conceptual care reprezintă vederea logică independentă de sistemul de gestiune al bazelor de date ales și reprezentat prin modelele de date bazate pe obiecte.

Modelul de date intern utilizat pentru ca schema conceptuală să poată fi înțeleasă de către sistemul de gestiune al bazei de date și reprezentat prin modelele de date fizice.

Fiecare model de date are propria reprezentare a datelor, dar întotdeauna un model este alcătuit dintr-o intensie și o extensie.

Extensia unei relații se referă la setul curent de înregistrări pe care îl conține. Acest set de înregistrări nu rămâne același tot timpul existenței bazei de date, suferind diverse modificări, pe măsura introducerii, actualizării sau ștergerii de date.

Partea cu caracter permanent în cadrul unei baze de date o reprezintă intensia sa sau schema bazei de date. Intensia bazei de date descrie structura tuplurilor unei relații. Operațiile limbajului de manipulare a datelor pot fi efectuate numai în condițiile în care se cunoaște această structură.

Cu alte cuvinte intensia unei baze de date reprezintă tipurile de entități, fiind considerată a fi modelul conceptual al bazei de date, pe când extensia reprezintă instanțierile tipurilor de înregistrări corespunzătoare tipurilor de entități precum și legăturile dintre acestea.

3.1.3. Modele de date bazate pe înregistrări

Astfel de modele descriu datele la nivel conceptual. Spre deosebire de modelele orientate pe obiecte, acestea sunt folosite cu scopul de a specifica structura logică generală a bazei de date și de a oferi un nivel ridicat al descrierii implementării. Modelele sunt denumite în acest fel deoarece baza de date este alcătuită din înregistrări de același tip. Fiecare tip de înregistrare are un număr fix de câmpuri, fiecare câmp având, de obicei, o lungime fixă, ceea ce duce la simplificarea reprezentării. Aceste modele nu oferă un mecanism de reprezentare directă a codului din baza de date. Pentru a efectua interogări și actualizări asupra bazei de date se folosesc o serie de limbaje individuale separate asociate modelului. Din această categorie de modele fac parte:

modelul de date ierarhic;

modelul de date rețea;

modelul de date relațional.

Astăzi, datorită dezvoltării fără precedent a Internetului, din ce în ce mai mult, se impune un alt tip de model, modelul de date semi-structurat, în format XML.

Modelul ierarhic

Din punct de vedere istoric, acesta a fost primul model de date ce a fundamentat un sistem de gestiune al bazelor de date și a fost dezvoltat de către firma IBM pentru produsul său IMS care utiliza limbajul DL/1.

Modelul ierarhic lucrează cu grupuri repetitive prin utilizarea unei structuri de date ce se bazează pe parcurgerea de sus în jos a unui arbore: datele aflate în înregistrările primare reprezintă ramurile arborelui, în timp ce datele ce formează grupurile repetitive reprezintă frunzele acestuia.

Avantajul modelului ierarhic este acela că metodele folosite la regăsirea înregistrărilor asociate din baza de date sunt mai simple decât cele folosite în modelul rețea.

Intensia modelului de date ierarhic este reprezentată cu ajutorul unui arbore de definiție ce reprezintă o diagramă a structurii de date în care sensul legăturilor funcționale este întotdeauna de la nodul părinte către nodul copil. O astfel de diagramă este un graf orientat alcătuit cu scopul reprezentării tipurilor de entități și a relațiilor dintre acestea. Nodurile grafului corespund tipurilor de entități, iar arcele grafului reprezintă legăturile funcționale dintre tipurile de entități.

Extensia modelului de date ierarhic se reprezintă sub forma unui tabel în care fiecare linie a tabelului este o înregistrare ce corespunde unei instanțieri a tipului de entitate. În tabele sunt permise duplicatele și, prin urmare, pot exista două instanțieri identice ale aceluiași tip de entitate. Un singur tabel din baza de date are rolul de rădăcină a arborelui în timp ce restul tabelelor formează mulțimea părinților și copiilor arborelui.

Figura 3.1. Modelul ierahic

O relație într-o bază de date ierarhică este reprezentată prin intermediul perechii părinte/copil. În acest tip de relație, tabelul părinte poate fi asociat cu unul sau mai multe tabele copil, dar un singur tabel copil poate fi asociat doar cu un singur tabel părinte. Aceste tabele sunt asociate în mod explicit cu ajutorul unor pointeri sau pe baza unui aranjament fizic al înregistrărilor în tabele.

Utilizatorul accesează datele pornind din rădăcina arborelui și parcurge un anumit drum unic până ajunge la datele căutate. O astfel de metodă de acces cere utilizatorului o foarte bună cunoaștere a structurii bazei de date.

Un avantaj al utilizării bazelor de date ierarhice este acela că utilizatorul poate extrage datele foarte rapid datorită legăturilor explicite definite în structura tabelelor. Un alt avantaj este acela că integritatea referențială se obține prin crearea structurii și nu poate fi încălcată, ceea ce face ca o înregistrare din tabelul copil să fie obligatoriu asociată unei înregistrări existente în tabelul părinte, iar o înregistrare ștearsă din tabelul părinte să impună eliminarea tuturor înregistrărilor asociate din tabelul copil.

Probleme deosebite vor apare în momentul în care utilizatorul dorește să introducă o înregistrare în tabelul copil care nu are asocieri cu nici o înregistrare din tabelul părinte. Acest tip de bază de date nu poate suporta asocierile complexe și, de aceea, deseori sunt probleme referitoare la redundanța datelor, deoarece este posibil să-i fie permisă introducerea de date inconsistente. Această problemă poate fi însă rezolvată prin crearea a două baze de date pentru a înlocui tipurile de relații mulți-la-mulți, așa cum se prezintă în figura de mai jos :

Figura 3.2. Rezolvarea relațiilor mulți-la-mulți

Deși bazele de date ierarhice ofereau un acces direct și rapid la date, dovedindu-și superioritatea într-o multitudine de situații specifice, devenise evident că era necesară introducerea unui nou model de date pentru a remedia problemele tot mai presante referitoare la redundanța datelor și la rezolvarea asocierilor complexe dintre înregistrări.

Modelul rețea

Modelul rețea a fost creat, în special, ca o încercare de a rezolva unele dintre problemele modelului ierarhic.

Figura 3.3. Modelul rețea

Așa cum se poate observa din figura 3.3., structura unei baze de date de tip rețea se poate reprezenta cu ajutorul conceptelor de noduri și seturi. Un nod reprezintă o colecție de înregistrări, în timp ce un set stabilește și reprezintă relațiile din cadrul unei bazei de date de tip rețea. O astfel de construcție transparentă relaționează o pereche de noduri prin utilizarea unuia dintre ele sub denumirea de proprietar, iar a celuilalt sub denumirea de membru.

Structura de tip set este o construcție ce stabilește și reprezintă o relație din cadrul bazei de date rețea (reprezintă o îmbunătățire remarcabilă față de relația părinte/copil). O astfel de structură suportă o relație de unu-la-mulți, ceea ce înseamnă faptul că o înregistrare din nodul proprietar poate fi relaționată cu una sau mai multe înregistrări aparținătoare nodului membru, dar unei singure înregistrări din nodul membru îi este asociată o singură înregistrare din nodul proprietar. Mai mult decât atât, o înregistrare aparținătoare nodului membru nu poate exista fără să fie asociată unei înregistrări existente în nodul proprietar.

Între o pereche de noduri se pot defini unul sau mai multe seturi, iar un singur nod poate fi implicat în seturi cu alte noduri din baza de date. Utilizatorul poate accesa date din cadrul unei baze de date de tip rețea prin cea mai potrivită structură de seturi. Spre deosebire de bazele de date ierarhice, în care accesul trebuie să înceapă cu nodul rădăcină, în bazele de date de tip rețea utilizatorul poate accesa datele indiferent de nod pe baza structurilor de tip set.

CODASYL a dezvoltat limbajul Common Business-Oriented Language (COBOL) pentru a scrie aplicații ce folosesc datele din bazele de date de tip rețea. Cu toate dezavantajele pe care le are, modelul de baze de date propus de CODASYL mai are și astăzi o largă răspândire în întreaga lume.

Bazele de date CODASYL folosesc în locul termenului de tabel, termenul de tip de înregistrare, dar caracteristicile acestuia nu diferă cu nimic față de cele ale unui tabel. Tipurile de înregistrări conțin pointeri la înregistrările provenite din alte tipuri de înregistrări. Un pointer este o valoare ce specifică locația unei înregistrări într-un fișier sau în memorie. De exemplu, înregistrarea ce conține date referitoare la un student, conține un pointer la o notă a acestuia, care în replică va conține un pointer la o altă notă ce aparține acelui student, ș.a.m.d. Termenul generic utilizat la descrierea tipurilor de înregistrări bazate pe pointeri este lista de legătură. Pointerii asociază înregistrările într-o structură organizată, numită rețea.

Bazele de date de tip rețea au performanțe excelente în cazul regăsirii seturilor de înregistrări ce aparțin unui anumit obiect, deoarece relațiile dintre înregistrări (pointeri) reprezintă parte constitutivă a bazei de date. În același timp, se permite utilizatorilor crearea de interogări mult mai complexe decât cele ce se pot elabora prin intermediul bazelor de date ierarhice, dar viteza bazelor de date de tip rețea scade atunci când se dorește căutarea înregistrărilor pe baza unor criterii specificate. Principalul dezavantaj al acestui tip de baze de date este legat de faptul că utilizatorul este obligat să cunoască foarte bine structura bazei de date pentru a se putea descurca cu structurile de seturi. Totodată, aplicațiile ce lucrează cu astfel de baze de date (în principal programele COBOL) trebuie să actualizeze atât valorile datelor cât și pointerii înregistrărilor ce se adaugă, șterg sau se modifică. Necesitatea actualizării secvențiale atât a datelor cât și a pointerilor duce la creșterea complexității proceselor în care sunt implicate tranzacții.

Un alt dezavantaj este acela că nu este ușoară modificarea structurii bazei de date fără a afecta programele aplicație care lucrează cu aceasta. Deoarece, așa cum s-a arătat, o relație este definită în mod explicit sub forma unei structuri de tip set, aceasta nu poate fi modificată fără a afecta programele aplicație ce folosesc această structură la căutarea datelor. Dacă se modifică o astfel de structură, trebuie modificate în mod corespunzător toate asocierile acesteia definite în programele aplicație.

Intensia modelului de baze de date de tip rețea este un graf cu arce numerotate pentru a indica drumul ce trebuie parcurs, deoarece un tip de entitate copil poate fi conectat la mai multe tipuri de entități părinte sau la același tip de entitate părinte prin mai multe arce.

Extensia acestui model este un tabel ce permite introducerea de înregistrări duplicat, dar înregistrările pot fi ordonate.

Modelul relațional

Acesta este cel mai folosit model de date folosit astăzi în întreaga lume, fiind un model de tip entitate-relație bazat pe elaborarea unui model conceptual. Modelul relațional al unei baze de date permite extinderea bazelor de date la nivelul calculatoarelor personale nemaifiind obligatorie utilizarea echipamentelor costisitoare cerute de minicalculatoare sau de calculatoarele de tip mainfraime.

Modelul a fost dezvoltat de către Dr. E. F. Codd de la San Jose Research Laboratories ce aparțineau firmei IBM în anul 1970. Cele mai importante caracteristici ale modelului relațional sunt simplitatea, suportul teoretic solid, precum și cele trei elemente componente de bază.

Un astfel de model este simplu deoarece el poate fi descris cu ajutorul unui număr mic de concepte care se referă la relații (structuri de date bidimensionale ce au proprietăți speciale), rânduri (datele aflate în cadrul relațiilor), coloane (câmpurile datelor din rândurile corespunzătoare) și chei (mecanismul de identificare și asociere a rândurilor aflate în unul sau mai multe tabele).

Modelul relațional are un suport teoretic foarte solid deoarece se bazează pe teoria matematică a seturilor, ceea ce înseamnă faptul că toate operațiile sunt încheiate cu succes, iar rezultatele operațiilor sunt predictibile.

Cele trei componente ale modelului relațional sunt:

componenta de structură a datelor (relații cu proprietăți speciale);

componenta de manipulare a datelor (operații predefinite prin care tehnologia relațională folosește un optimizator inteligent pentru a găsi calea de acces la date);

componenta de integritate a datelor (reguli necesare protecției datelor la efectuarea unor operații incorecte).

Principalul avantaj al modelului relațional este acela că nu este necesară utilizarea atât a pointerilor cât și a datelor în cadrul tabelelor, folosind în schimb relații pentru a accesa valori corespondente din mai multe tabele.

O relație constă dintr-o asociere între înregistrările aflate în două tabele ce au aceleași valori ale atributelor. Deoarece tabelele relaționale nu conțin pointeri, datele aflate în astfel de tabele sunt independente de metodele folosite de către sistemul de gestiune al datelor în lucrul cu înregistrările tabelelor.

Intensia modelului relațional este o schemă relațională cu una sau mai multe scheme de relație. Fiecare schemă de relație are propriul nume și propriile atribute.

Extensia modelului relațional este un tabel ce nu permite înregistrări duplicat. Fiecare schemă de relație introduce un tabel în schema relațională. Modelul de date relațional folosește tabele bidimensionale ce reprezintă entitățile și constă din rânduri și coloane. O coloană reprezintă un atribut al unei entități ce mai poartă și denumirea de câmp sau proprietate. Un rând reprezintă un tuplu care este o instanță a unui tip de entitate sau de relație sau orice altceva din baza de date. De obicei una dintre coloanele tabelului este numită cheie primară și are o valoare unică (Brown, The Relational Model).

Simplitatea modelului bazei de date relaționale constă din simplitatea conceptelor cu care operează: structuri simple și abstracte de date, independența fizică de date, cadrul puternic, general și realist oferit aplicațiilor ș.a.m.d.

Modelul relațional oferă o interfață flexibilă ce este prevăzută cu cele mai potrivite componente necesare oricărui utilizator la toate nivelele, oferind o mare independență a datelor (produsul obținut este relativ independent de implementarea internă).

Baza de date relațională constă din unul sau mai multe relații sau tabele. Principalele concepte ale modelului relațional sunt:

Atributul – este o coloană ce are un nume propriu și unic într-o relație (câmp). Fiecare relație conține o listă de atribute (sau coloane) definite pe un anumit domeniu.

Domeniul – reprezintă setul posibil de valori pe care îl poate avea unul sau mai multe atribute. Utilizatorul poate defini domeniul de definiție, dar numai în anumite produse își poate defini propriile domenii.

Tuplu – un rând din cadrul unei relații (înregistrare). Un rând dintr-un tabel reprezintă asocierea dintre seturile de valori. Fiecare relație conține un set de tupluri (sau rânduri).

Intensia – structura unei relații împreună cu specificațiile și constrângerile de domeniu aplicate. Se modifică rar.

Extensia – starea relației (valorile din cadrul unei relații se pot modifica). Reprezintă conținutul curent al bazei de date ce corespunde schemei bazei de date și se modifică frecvent.

Gradul – numărul de atribute dintr-o relație.

Cardinalitatea – numărul de tupluri dintr-o relație.

Baza de date relațională – reprezintă o colecție de relații ce pot fi modificate (tabele). O astfel de colecție este descrisă sub forma unui set de scheme de relații din cadrul bazei de date, numite scheme relaționale ale bazei de date. Relațiile sunt alcătuite din două părți:

instanța – un tabel cu rânduri și coloane;

schema – specifică numele relației împreună cu numele și tipul fiecărei coloane.

Termenul de relație este folosit în sensul său matematic acceptat:

Se dă o schemă de relație R = r(A1, …, An) pe un set de domenii {D1, D2…, Dn}. O relație n-ară r reprezintă un subset al produsului cartezian al acestor domenii: D1 x D2 x … x Dn.

Proprietățile unei relații sunt:

relațiile sunt alcătuite din rânduri și coloane;

într-o relație nu are importanță ordinea de apariție a rândurilor sau coloanelor;

între tabele nu există o asociere explicită (nici una vizibilă cuiva care accesează datele);

fiecare înregistrare poate fi identificată în mod unic;

fiecare rând din cadrul unui tabel are același set de coloane;

fiecare coloană are un singur tip de dată (nu sunt acceptate redefiniri pentru diferite valori).

Datorită acestor proprietăți și a fundamentului matematic, modelul relațional permite proiectanților concentrarea mai întâi asupra semanticii datelor și a relațiilor dintre ele și abia apoi asupra implementarii fizice a semanticii respective pentru a se adapta cât mai bine cerințelor și specificațiilor impuse.

3.1.4. Modele logice orientate pe obiecte

Descriu datele la nivelele conceptual și extern oferind o flexibilitate ridicată. Astfel de modele pot specifica în mod explicit constrângerile aplicate datelor și se bazează pe următoarele concepte:

entitate – un obiect sau concept din lumea reală ce are identitate proprie;

atribut – un set de proprietăți utilizate la descrierea entităților;

relație – o asociere între două sau mai multe entități.

Din această categorie fac parte:

modelul entitate-relație;

modelul orientat pe obiecte;

modelul obiectual-relațional;

modelul binar;

modelul semantic de date;

modelul infologic;

modelul funcțional de date.

Dintre acestea se remarcă modelele următoare:

Modelul entitate-relație

Se bazează pe o percepție a lumii reale ca fiind alcătuită dintr-o colecție de obiecte de bază sau concepte (entități) împreună cu relațiile care se stabilesc între ele. Fiecare entitate are asociat un set de atribute care o descriu, iar o relație reprezintă o asociere dintre două sau mai multe entități. Mulțimile tuturor entităților sau relațiilor de același tip sunt cunoscute sub denumirea de tipuri de entități sau relații. Un alt element important în cadrul diagramelor entitate-relație îl reprezintă precizarea constrângerilor de cardinalitate care exprimă numărul de entități asociate altui tip de entitate prin intermediul unui tip de relație.

Modelul orientat pe obiecte

Un astfel de model este utilizat doar în scopuri speciale, cele mai cunoscute produse de acest tip fiind: ObjectStore, Gemstone, Ontos, O2, Jasmine, Cache. Modelul se bazează pe o colecție de obiecte, la fel ca în cazul modelului entitate-relație.

Un obiect conține valorile înmagazinate în cadrul unor variabile instanțiate în interiorul acestor obiecte. Spre deosebire de modelul entitate-relație, valorile sunt ele însele obiecte. Astfel de obiecte conțin alte obiecte imbricate până la un nivel oarecare.

Obiectul mai conține elemente de cod ce operează asupra acestuia și care se numesc metode. Obiectele ce conțin același tip de valori și aceleași metode sunt grupate în clase. O clasă poate fi interpretată ca fiind definiția de tip a obiectului respectiv.

Singura modalitate prin care un obiect poate accesa datele altui obiect este prin invocarea metodelor acelui obiect, ceea ce este cunoscut sub numele de trimitere de mesaje către obiectul respectiv.

Părțile interne ale obiectului respectiv, variabilele și metodele, nu sunt vizibile în exterior, obținându-se astfel două nivele de abstractizare a datelor. Spre deosebire de entitățile din modelul entitate-relație, fiecare obiect are un identificator unic indiferent de valorile pe care le conține.

Două obiecte ce au aceleași valori sunt distincte (polimorfism). Distincția se menține și la nivelul fizic prin atribuirea unui identificator unic al obiectului respectiv.

Modelul orientat pe obiecte are toate caracteristicile limbajului de programare orientat pe obiecte, făcând ca modelul relațional să fie coborât la stadiul de depozit de date.

Esențial pentru un astfel de model este faptul că proiectantul bazei de date poate opera cu fiecare element al bazei de date, inclusiv cu setul de operații ce manipulează datele din cadrul bazei de date în cadrul aplicației scrise într-un limbaj orientat pe obiecte.

De această dată însă nu mai există o separare clară între date și aplicație. Spre deosebire de modelul relațional, care are un suport teoretic extrem de solid, modelul orientat pe obiecte nu prezintă o astfel de caracteristică, ceea ce face să nu existe un consens în definirea lor. Totuși, organizația OMG (Object Management Group) a depus mari eforturi, reușind să propună un model ce a devenit standard pentru toate sistemele de gestiune a bazelor de date orientate pe obiecte.

Modelul obiectual-relațional

Acest model (cunoscut inițial sub numele de model de date relațional extins) a extins modelul relațional prin introducerea unor serii de elemente și caracteristici specifice modelului obiectual, cum ar fi: clase, încapsulare, moștenire. Cele mai cunoscute produse de pe piață sunt: Postgres, Informix, DB2, Oracle.

Scopul acestei extinderi a fost acela de a permite bazelor de date relaționale să opereze cu tipuri complexe de date, cum ar fi: imagini audio, video, elemente de proiectare. Modelul se află încă la stadiul incipient de dezvoltare, chiar dacă este promovat de cei mai mari producători de pe piață de produse de baze de date.

3.1.5. Modele fizice de date

Sunt modele utilizate la descrierea datelor la cel mai de jos nivel. Ele conțin informații despre structura înregistrărilor, ordinea înregistrărilor, precum și căile de acces la date. Din această categorie fac parte:

modelul unificat al datelor;

memoria cadru.

3.1.6. Avantajele bazelor de date relaționale

Sunt următoarele:

Integritate încorporată la mai multe nivele. Integritatea datelor este integrată în cadrul modelului la nivel de câmp pentru a asigura precizia datelor. La nivel de tabel asigură faptul că o înregistrare nu mai poate fi introdusă încă o dată în baza de date, precum și detectarea lipsei valorilor din câmpurile cheie primară. La nivel de relație asigură validitatea acestora între tabele. La nivel logic, asigură acuratețea logică a datelor.

Independența logică și fizică a datelor de programele aplicație: nici modificările efectuate de către utilizator modelului logic al bazei de date, nici modificările efectuate de către producătorul bazei de date implementării fizice a acesteia, nu vor afecta programele aplicațiilor care utilizează baza de date.

Garantează consistența și precizia datelor: datele sunt consistente și precise datorită multiplelor nivele de integritate ce pot fi introduse în baza de date.

Extragerea cu ușurință a datelor din baza de date. În urma comenzilor introduse de către utilizator, datele din baza de date pot fi extrase fie dintr-un singur tabel, fie dintr-o multitudine de tabele asociate prin intermediul relațiilor, ceea ce oferă posibilitatea prezentării datelor într-un număr nelimitat de moduri.

Acestea și alte avantaje au adus beneficii extrem de importante comunității de afaceri și tuturor acelora care au nevoie de colectarea și înmagazinarea de date. Deocamdată, bazele de date relaționale dețin supremația pe piața acestor produse, fiind alese în cele mai multe dintre cazuri.

Până de curând, cel mai mare dezavantaj al bazelor de date relaționale îl reprezenta faptul că programele aplicație care le foloseau erau foarte lente în execuție. Problema nu era una a bazelor de date relaționale, ci tehnologiei deficitare de care se dispunea la momentul introducerii modelului. Începând cu anii ’90 pașii înainte făcuți atât în domeniul hardware cât și software au făcut ca o astfel de problemă să fie din ce în ce mai puțin vizibilă.

3.1.7. Chei

O cheie este un câmp ce are o valoare unică, corespunzătoare fiecărei înregistrări dintr-un tabel. Sunt mai multe tipuri de chei, fiecare având propriile caracteristici.

3.1.7.1. Cheia candidat

Este un atribut sau un set de atribute ce identifică în mod unic un tuplu dintr-un tabel.

3.1.7.2. Cheia primară

Reprezintă una dintre cheile candidat desemnate în cadrul unui tabel. Orice tabel trebuie să aiba o cheie primară.

O cheie primară trebuie să fie:

Stabilă. Valoarea unei chei primare nu trebuie să se modifice sau să devină nulă pe tot parcursul existenței unei entități (Brooks, 1992). O cheie primară stabilă ajută la păstrarea unui model stabil (Whitener, 1989). De exemplu, dacă se analizează înregistrarea datelor unui student, valoarea cheii primare nu trebuie să se modifice în timp, așa cum se întâmplă cu valorile din câmpul în care se păstrează vârsta acestuia.

Minimală. Cheia primară trebuie să fie alcătuită dintr-un număr minim de câmpuri ce sunt capabile să asigure unicitatea.

Centrată pe date, nu pe informații. Nu trebuie să apară grupări de caracteristici în cadrul unei valori a unei chei ce păstrează meta-informații adiționale, deoarece nu se respectă principiul atomicității atributelor, crescând astfel posibilitatea ca valorile cheii primare să se modifice.

Definitivă. În momentul introducerii unei noi înregistrări, trebuie să existe posibilitatea introducerii unei valori. Cheia primară acționează ca un mecanism de constrângere suplimentară a entității deoarece nu poate fi introdusă o instanță a unui tip de entitate dacă aceasta nu are o valoare permisă în cheia primară.

Accesibilă. Oricine dorește să creeze, citească, sau șteargă o înregistrare trebuie să poată vizualiza valoarea cheii primare (Whitener, 1989).

3.1.7.3. Cheie alternativă

Este o cheie candidat ce nu a fost desemnată drept cheie primară. Ea poate deveni cheie primară dacă cheia primară aleasă inițial nu mai corespunde la un moment dat.

3.1.7.4. Cheie externă

Există doar în situația în care se stabilesc două sau mai multe relații între tabelele bazei de date. Un atribut al unui tabel trebuie să existe și în celălalt tabel legat de primul printr-o relație.

4. BAZELE MODELULUI RELAȚIONAL

Conceptul de bază de date introduce termenul de abstractizare a datelor prin mascarea față de utilizator a detaliilor legate de tehnica de stocare a datelor în calculator. Principalul instrument folosit la realizarea acestui scop este modelul de date, care este alcătuit dintr-un set de concepte ce pot fi utilizate la descrierea structurii bazei de date, cum ar fi de exemplu, tipurile de date, relațiile și constrângerile stabilite pentru datele reprezentate.

Există trei tipuri de modele de date: modelul de date conceptual, modelul de date logic și modelul de date fizic.

Modelul conceptual

Folosește o serie de concepte, cum ar fi entitate, relație și atribut pentru a descrie cât mai fidel modul în care este percepută de către utilizator realitatea ce urmează a fi reprezentată în cadrul unei baze de date. Pentru a realiza un model conceptual cât mai corect se folosesc o serie de instrumente ce ajută în modelare, dintre care cel mai folosit este diagrama entitate-relație. De obicei, proiectarea unui model conceptual respectă următorul algoritm:

Pasul 1. Identificarea tipurilor de entități. Constă din identificarea și documentarea principalelor tipuri de entități din punct de vedere al beneficiarului bazei de date. În acest scop este necesară citirea cu atenție a tuturor specificațiilor și cerințelor acestuia, urmată de crearea unei liste a potențialelor tipuri de entități. Tipurile de entități reprezintă obiectele sau conceptele ce prezintă cel mai mare interes în cadrul sistemului. De obicei, se creează mai multe tipuri de entități decât este necesar, urmând ca ulterior să se recurgă la o rafinare a acestora, eliminându-se unele dintre ele.

Pasul 2. Eliminarea tipurilor de entități duplicat. În primul rând trebuie să se obțină asigurarea că, într-adevăr, fiecare tip de entitate utilizat reprezintă un tip distinct de entitate și nu nume diferite ale aceluiași tip de entitate. Este foarte important să nu se cadă în capcana definirii unui tip de entitate care să reprezinte întregul sistem. De exemplu, la modelarea unei biblioteci, tipurile de entități pot fi cărțile, autorii, cititorii etc., dar în nici un caz nu poate fi definit un tip de entitate biblioteca deoarece aceasta reprezintă întregul sistem.

Pasul 3. Identificarea tipurilor de relații. În cadrul acestei etape se recurge la identificarea și documentarea celor mai importante tipuri de relații ce se pot stabili între tipurile de entități rămase după parcurgerea pasului anterior. În acest scop se examinează fiecare tip de entitate în parte pentru a putea determina poziția și legăturile acesteia în cadrul sistemului. În același timp se face o analiză a cardinalității și a participării fiecărui tip de entitate, identificându-se totodată constrângerile impuse tipurilor de entități participante.

Pasul 4. Identificarea și asocierea atributelor corespunzătoare fiecărui tip de entitate sau relație. În această etapă trebuie obținută asigurarea că tipurile de entități sunt cu adevărat necesare și nu sunt atribute ale altor tipuri de entități. De exemplu, telefonul poate fi o entitate de sine stătătoare sau un atribut exprimat sub forma unui număr de telefon atribuit tipului de entitate Studenți.

Pasul 5. Stabilirea domeniilor de valori ale atributelor. Se realizează printr-o analiză amănunțită a situațiilor ce pot apare, documentându-se fiecare hotărâre luată.

Pasul 6. Stabilirea atributelor cheie candidat și primară. Dacă în cadrul analizei se identifică mai multe chei candidat, se stabilește cheia primară, documentându-se hotărârea luată.

Pasul 7. Specializare/generalizarea tipurilor de entități. Aceasta etapă este una opțională în cadrul modelului relațional și are ca efect stabilirea superclaselor, respectiv a subclaselor tipurilor de entități, dacă este cazul.

Pasul 8. Construirea diagramelor entitate-relație. Prin parcurgerea acestei etape se asigură o mai bună înțelegere a realității care se modelează.

Pasul 9. Eliminarea tipurilor de relații duplicat.

Pasul 10. Revizuirea diagramei entitate-relație împreună cu beneficiarul bazei de date.

Modelarea realizată cu ajutorul unei diagrame entitate-relație este un proces iterativ. De obicei, nu există o singură soluție și, ca urmare, nici o singură diagramă de acest fel. Din acest motiv se practică crearea mai multor diagrame entitate-relație urmată de rafinarea fiecărei variante din care se va alege ulterior, împreună cu beneficiarul bazei de date, diagrama optimă. De remarcat este faptul că, de cele mai multe ori, nu se poate spune că o variantă este mai bună decât alta, dar unele variante pot oferi soluții mai bune decât altele.

Implementarea tipurilor de relații în cadrul tabelelor

Dându-se o relație R care se stabilește între două tipuri de entități E și F se impun următoarele reguli:

dacă relația E-R-F este de tip unu-la-mulți, cheia primară a relației F se introduce în relația E;

dacă relația E-R-F este de tip unu-la-unu, cheia primară a relației E se introduce în relația F, sau cheia primară a relației F se introduce în relația E;

dacă relația E-R-F este de tip mulți-la-mulți, se creează o nouă relație ce conține cheile primare atât ale lui E cât și ale lui F;

dacă relația R are atribute, acestea trebuie transferate în cadrul unei relații folosindu-se cheile externe.

Modelul logic

Acest model folosește concepte ce mai pot fi înțelese încă de către utilizator, dar care presupun reprezentări referitoare la modul în care utilizatorul dorește să vizualizeze datele. În continuare tehnicile de înmagazinare a datelor rămân transparente utilizatorului. Proiectul logic al unei baze de date relaționale creează și validează modelul logic de date local. Scopul urmărit este acela de a construi un model logic de date bazat pe modelul conceptual de date creat anterior, după care se trece la validarea acestui model cu ajutorul tehnicii normalizării. Un astfel de model parcurge, de regulă, următorul algoritm:

Pasul 1. Transformarea modelului conceptual local în model logic local de date. În acest scop se trece la rafinarea modelului conceptual de date local, prin eliminarea caracteristicilor incomode:

eliminarea relațiilor mulți-la-mulți;

eliminarea relațiilor complexe;

eliminarea relațiilor recursive;

eliminarea relațiilor ce conțin atribute;

revizuirea relațiilor unu-la-unu.

Pasul 2. Stabilirea relațiilor corespunzătoare modelului logic de date. În această etapă se creează și documentează fiecare relație, inclusiv cheile primare și externe.

Pasul 3. Validarea modelului folosind tehnica normalizării.

Pasul 4. Validarea modelului în cazul folosirii tranzacțiilor. Trebuie să se obțină asigurarea că modelul de date creat suportă tranzacțiile cerute de către beneficiarul bazei de date.

Pasul 5. Stabilirea constrângerilor de integritate. În acest scop trebuie identificate:

datele necesare;

integritatea referențială;

constrângerile de domeniu impuse atributelor;

constrângerile logice;

integritatea entității.

Pasul 6. Revizuirea modelului logic local împreună cu beneficiarul bazei de date.

Pasul 7. Construirea și validarea modelului logic global de date. Scopul acestei etape este acela de a realiza, pe baza modelelor logice locale de date un singur model logic global ce poate fi utilizat la reprezentarea realității care se modelează.

Pasul 9. Unificarea modelelor logice locale în cadrul unui singur model loc global. Se urmăresc:

revederea numelor tipurilor de entități și a cheilor primare;

revederea numelor relațiilor;

aducerea în cadrul unui singur model a tipurilor de entități din cadrul modelelor logice locale;

introducerea în cadrul modelului logic global a tipurilor de entități specifice fiecărei vederi logice locale;

aducerea în cadrul unui singur model a tipurilor de relații din cadrul modelelor logice locale;

căutarea tipurilor de entități și relații lipsă;

verificarea cheilor externe;

verificarea constrângerilor de integritate;

crearea modelului logic global de date;

actualizarea documentației.

Pasul 10. Validarea modelului logic global. Se face prin utilizarea normalizării.

Pasul 11. Prevederea modificărilor ce trebuie efectuate în vederea dezvoltărilor ulterioare.

Pasul 12. Revizuirea modelului logic global împreună cu beneficiarul bazei de date.

Modelul fizic

Acest tip de model descrie reprezentarea datelor în formatul, modul de acces și ordinea reală în care acestea sunt păstrate. Fiecare câmp dintr-un tabel are un anumit tip de dată. Standardul SQL-92 suportă o varietate foarte largă de tipuri de date dintre care enumerăm:

char(n) sau character(n): șir de caractere de lungime fixă, stabilită de utilizator;

varchar(n) sau character varying: șir de caractere de lungime variabilă a cărui lungime maximă este stabilită de către utilizator;

int sau integer: tipul întreg a cărui lungime depinde de sistem;

smallint: tip întreg de dimensiuni mai mici a cărui lungime depinde de sistem;

numeric(p, d): un număr zecimal a cărui precizie este stabilită de către utilizator, ce constă dintr-un număr total de cifre (p), dintre care d reprezintă cifrele de la partea zecimală; de exemplu, numeric(3, 1) permite stocarea numărului 1.22 exact așa cum apare și nu în formatul 1.2;

real sau double precision: numere reale a căror precizie depinde de sistem;

float(n): număr real a cărui precizie este stabilită de către utilizator (n cifre);

date: tip de dată calendaristică;

time: exprimă ora unei zile în ore, minute și secunde.

SQL-92 permite efectuarea de calcule aritmetice și de comparații pe diverse intervale numerice, folosind operatori de transformare a tipurilor (cast).

4.4. NORMALIZAREA BAZELOR DE DATE.

Normalizarea reprezintă proiectul logic al unei baze de date. Principalul obiectiv al unui proiect logic este dezvoltarea schemelor relaționale corecte. În acest scop trebuie:

evitate datele redundante;

evitate anomaliile de modificare;

asigurată reprezentarea relațiilor dintre atribute;

facilitată verificarea actualizărilor care nu trebuie să forțeze integritatea bazei de date.

Normalizarea este un proces de reducere a redundanțelor și creștere a stabilității unei baze de date. Existența redundanțelor într-o bază de date produce următoarele efecte defavorabile:

pierdere inutilă de spațiu;

scăderea performanțelor de cost;

apariția inconsistențelor;

imposibilitatea reprezentării datelor.

Normalizarea presupune determinarea locului în care trebuie plasate anumite date în cadrul tabelelor bazei de date, stabilind totodată relațiile dintre acestea. Prin cuvântul “normă” se înțelege respectarea unui standard și reprezintă setul de condiții impuse și cunoscute sub denumirea de forme normale. Pentru a respecta aceste reguli trebuie identificate condițiile care trebuie respectate în scopul evitării încălcării integrității datelor impunându-se în acest scop descompunerea relațiilor. Denormalizarea este procesul invers, opus normalizării efectuat cu scopul îmbunătățirii performanțelor bazei de date.

Normalizarea este, cu alte cuvinte, un proces de descompunere a unui tabel în două sau mai multe tabele cu scopul eliminării redundanțelor care generează anomalii de actualizare. În timpul procesului de normalizare, structura tabelelor se testează cu ajutorul formelor normale care impun regulile de descompunere.

O formă normală reprezintă, cu alte cuvinte, un set specific de reguli ce pot fi utilizate în scopul testării structurii unui tabel pentru a obține asigurarea că structura respectivă nu pune probleme la introducerea sau extragerea datelor.

Formele normale folosite în mod curent sunt Prima, A doua, A treia formă normală, Forma normală Boyce-Codd, A patra și A cincea formă normală.

5. PROIECTAREA UNEI BAZE DE DATE PRIVIND EVIDENȚA CĂRȚILOR ȘI CITITORILOR ÎNTR-O BIBLIOTECĂ ȘCOLARĂ

5.1. DESCRIEREA APLICAȚIEI

La nivelul unei biblioteci se poate realiza o bază de date. Prin interogarea bazei de date se vor obține informații despre o carte sau un client specificat, despre împrumuturile făcute de un client specificat sau despre cărțile ce nu au fost returnate până la data restantă.

Tabelele din cadrul programului sunt:

CĂRȚI(books)

CATEGORII(category)

ÎMPRUMUTURI(loans)

EDITURI(publishers)

CITITORI(readers)

Fiecare carte este caracterizată de datele sale specifice. Pentru fiecare carte se vor cunoaște: id carte, titlul și autorul, anul ediției, editura, categoria.

Pentru evidența categoriilor se vor cunoaște: id categorie, numele categorie.

Este necesară și o evidență a împrumuturilor efectuate. Pentru aceasta se vor cunoaște: id împrumut, id cititor, id carte, data împrumutului, data până la care trebuie returnată cartea, un câmp care precizează dacă cartea a fost returnată sau nu.

Pentru evidența editurilor se vor cunoaște: id editură, numele editurii și descrierea editurii.

Cititorii sunt caracterizați de următoarele argumente : id cititor, nume cititor, prenume cititor, codul numeric personal, adresa, cititor activ sau ”expirat”.

Bibliotecar

5.2. DESCRIEREA MODELULUI RELAȚIONAL AL DATELOR PE BAZA

DEPENDENȚELOR FUNCȚIONALE DINTRE ATRIBUTE

Legătura dintre tabele, edituri și cărți , se realizează prin câmpul publisher_id care reprezintă id – ul editurii. Între cele două tabele există o legătură 1: n deoarece o editură are editate mai multe cărți.

Legătura dintre tabele, categori și cărți , se realizează prin câmpul category_id care reprezintă id – ul categoriei. Între cele două tabele există o legătură 1: n deoarece o categorie conține mai multe cărți.

Tabela cărți se leagă de tabela împrumuturi prin câmpul numit book_id ce reprezintă id cărții care este împrumutată. Între tabela cărți și tabela împrumuturi există legătură de tipul 1:1 deoarece o carte poate fi împrumutată de către un singur client la un moment dat.

Tabela cititori se leagă de tabela împrumuturi prin câmpul numit id ce reprezintă id cititorului. Între tabela cititori și tabela împrumuturi există legătură de tipul 1: n deoarece un cititor poate împrumuta până la trei cărți .

Adaugă carte

Formularul Adauga Carte are următoarele câmpuri : titlu, autor, an, categorie, editură și două butoane Adauga și Anuleaza.

Câmpurile titlu, autor, an, categorie, editură sunt de tip text, trebuie obligatoriu să fie completate pentru a adăuga o nouă carte. Dacă se dorește renunțarea la introducerea unei cărți se alege opțiunea Anuleaza.

<form class="form-horizontal" action="adaugacarte-action.php" onsubmit="return validateForm();" method="get">

<label for="inputTitle" class="control-label">Titlu</label>

<input class="form-control" id="inputTitle" placeholder="Titlu" type="text" name='inputTitle'

value="<?php if ($editeaza) { echo $detaliiCarte["title"]; } ?>">

<label for="inputAuthor" class="control-label">Autor</label>

<input class="form-control" id="inputAuthor" placeholder="Autor" type="text" name="inputAuthor"

value="<?php if ($editeaza) { echo $detaliiCarte["author"]; } ?>">

<label for="inputYear" class="control-label">An</label>

<input class="form-control" id="inputYear" placeholder="An" type="text" name="inputYear"

value="<?php if ($editeaza) { echo $detaliiCarte["year"]; } ?>">

<label for="inputCategory" class="control-label">Categorie</label>

<input class="form-control" id="inputCategory" placeholder="Categorie" type="text" name="inputCategory" value="<?php if ($editeaza) { echo $detaliiCarte["category"]; } ?>">

<label for="inputYear" class="control-label">Editura</label>

<input class="form-control" id="inputEditura" placeholder="Editura" type="text" name="inputPublisher" value="<?php if ($editeaza) { echo $detaliiCarte["publisher"]; } ?>">

<a class="btn btn-sm btn-default "href="/test/listacarti.php">Salveaza</a>

<a class="btn btn-sm btn-default "href="/test/listacarti.php">Anuleaza</a>

</form>

Pentru editare carte se folosește același formular cu diferența că, datele sunt trimise la altă funcție care le procesează și le introduce în baza de date.

Butonul Adauga apelează funcția addNewBook :

function addNewBook($title, $author, $year, $category, $publisher){

$db=getConnection();

$new_category_id = getNewCategoryId( $db, $category );

$new_publisher_id = getNewPublisherId( $db, $publisher );

$q_insert_new_book = "INSERT INTO books( author, title, year, publisher_id, category_id ) VALUES ( '$author', '$title', '$year', '$new_publisher_id', '$new_category_id')";

if(!$result = $db->query($q_insert_new_book)){

die('There was an error running the query [' . $db->error . ']');

}

header('Location: listacarti.php');

}

Se verifică dacă categoria există. Dacă categoria există se selectează id, dacă nu există se inserează în tabela categorii o nouă categorie și se selectează id –ul noii categorii inserate :

function getNewCategoryId( $db, $category ){

$q_category="SELECT c.id AS category_id FROM category c WHERE UPPER(c.name) = UPPER('$category')";

if(!$result = $db->query($q_category)){

die('There was an error running the query [' . $db->error . ']');

}

$num_rows = $result->num_rows;

if ($result->num_rows == 0) {

$q_insert_category="INSERT INTO category(name) VALUES ('$category')";

if(!$result = $db->query($q_insert_category)){

die('There was an error running the query [' . $db->error . ']');

}

$q_get_new_category_id = "SELECT c.id AS category_id FROM category c WHERE c.name='$category'";

if(!$result = $db->query($q_get_new_category_id)){

die('There was an error running the query [' . $db->error . ']');

}

$new_category_id = $result->fetch_assoc()['category_id'];

}else{

$new_category_id = $result->fetch_assoc()['category_id'];

}

return $new_category_id;

}

Se verifică dacă editura există. Dacă editura există se selectează id, dacă nu există se inserează în tabela edituri o nouă editura și se selectează id –ul noii edituri inserate :

function getNewPublisherId( $db, $publisher ){

$q_publisher="SELECT p.id AS publisher_id FROM publishers p WHERE UPPER(p.name) = UPPER('$publisher')";

if(!$result = $db->query($q_publisher)){

die('There was an error running the query [' . $db->error . ']');

}

$num_rows = $result->num_rows;

if ($result->num_rows == 0) {

$q_insert_publishers="INSERT INTO publishers(name) VALUES ('$publisher')";

if(!$result = $db->query($q_insert_publishers)){

die('There was an error running the query [' . $db->error . ']');

}

$q_get_new_publisher_id = "SELECT p.id AS publisher_id FROM publishers p WHERE UPPER(p.name) = UPPER('$publisher')";

if(!$result = $db->query($q_get_new_publisher_id)){

die('There was an error running the query [' . $db->error . ']');

}

$new_publisher_id = $result->fetch_assoc()['publisher_id'];

}else{

$new_publisher_id = $result->fetch_assoc()['publisher_id'];

}

return $new_publisher_id;

}

?>

Adaugă cititor

Formularul Adauga Cititor are următoarele câmpuri : nume, prenume, C. N. P, adresa și două butoane Adauga și Anuleaza.

<form action="adaugacititor-action.php" onsubmit="return validateForm();" method="get">

<input id="inputNume" placeholder="Nume" type="text" name='inputNume' >

<input id="inputPrenume" placeholder="Prenume" type="text" name="inputPrenume">

<input id="inputCNP" placeholder="CNP" type="text" name="inputCNP">

<input id="inputAdresa" placeholder="Adresa" type="text" name="inputAdresa">

<button center" type="submit" name="adauga">Adauga</button>

<button center" type="submit" name="anuleaza">Anuleaza</button>

</form>

Câmpurile nume, prenume, C.N.P. adresă sunt de tip text, trebuie obligatoriu să fie completate pentru a adăuga o nou cititor. C.N.P. trebuie să conțină doar 13 cifre pentru a se înregistra un nou cititor. Dacă se dorește renunțarea la introducerea unui cititor se alege opțiunea Anuleaza.

Câmpul C.N.P trebuie sa fie unic, astfel înainte de a se introduce cititorul în baza de date se face o verificare a CNP-ului. Dacă acesta există un mesaj de atenționare va apărea când se apasă pe butonul adaugă.

Funcția care verifică dacă un CNP există deja în baza de date este următoarea:

function isCNPUnique( $cnp, $idReader ){

$db=getConnection();

if ($idReader != "") {

$sql = "SELECT id FROM readers WHERE cnp = '$cnp' AND id != $idReader";

}else{

$sql = "SELECT id FROM readers WHERE cnp = '$cnp'";

}

if ( $result->num_rows > 0){

return 0;

}

return 1;

}

Când se editează un cititor se apelează aceiați functțe și de aceia trebuie luat în considerare și id-ul(câmp unic) cititorului.

După ce toate câmpurile sunt validate, se apelează funcția addNewReader:

function addNewReader($last_name, $first_name, $cnp, $address){

$db=getConnection();

$q_add_new_reader="INSERT INTO readers( first_name, last_name, cnp, address) VALUES ('$first_name', '$last_name', '$cnp', '$address')";

if(!$result = $db->query($q_add_new_reader)){

die('There was an error running the query [' . $db->error . ']');

}

}

La editarea unui cititor deja existent în baza de date se apelează funcția editReader:

function editReader($id, $last_name, $first_name, $cnp, $address){

$db=getConnection();

$q_add_new_reader="UPDATE readers SET first_name = '$first_name', last_name = '$last_name', cnp = '$cnp', address = '$address' WHERE id = '$id' ";

if(!$result = $db->query($q_add_new_reader)){

die('There was an error running the query [' . $db->error . ']');

}

}

5.2.3. Listă cărți

Lista Carti este o pagină care își ia datele pentru fiecare carte introdusă din Adauga Carte, conține un buton Editează, care permite modificarea datelor pentru o carte salvată în baza de date.

<div class="col-sm-10 col-sm-offset-1">

<table class="table table-striped table-hover ">

<thead>

<tr>

<th>#</th>

<th>Titlu</th>

<th>Autor</th>

<th>An</th>

<th>Editura</th>

<th>Categorie</th>

</tr>

</thead>

<tbody>

<?php

$id=0;

foreach ($list as $value){

$idCarte=$value['id'];

$row="<tr>" .

"<td>" . ++$id . "</td>" .

"<td>" . $value['title'] . "</td>" .

"<td>" . $value['author'] . "</td>" .

"<td>" . $value['year'] . "</td>" .

"<td>" . $value['publisher'] . "</td>" .

"<td>" . $value['category'] . "</td>" . "<td>" . "<a class=\"btn btn-sm btn-default\" href=\"/test/adaugacarte.php?id=$idCarte&action=edit\">Editeaza</a>" . "</td>" .

"</tr>";

echo $row;

}

?>

</tbody>

</table>

</div>

Butonul Editează are ca rezultat următoarea fereastră :

<form class="form-horizontal" action="adaugacarte-action.php" onsubmit="return validateForm();" method="get">

<label for="inputTitle" class="control-label">Titlu</label>

<input class="form-control" id="inputTitle" placeholder="Titlu" type="text" name='inputTitle'

value="<?php if ($editeaza) { echo $detaliiCarte["title"]; } ?>">

<label for="inputAuthor" class="control-label">Autor</label>

<input class="form-control" id="inputAuthor" placeholder="Autor" type="text" name="inputAuthor"

value="<?php if ($editeaza) { echo $detaliiCarte["author"]; } ?>">

<label for="inputYear" class="control-label">An</label>

<input class="form-control" id="inputYear" placeholder="An" type="text" name="inputYear"

value="<?php if ($editeaza) { echo $detaliiCarte["year"]; } ?>">

<label for="inputCategory" class="control-label">Categorie</label>

<input class="form-control" id="inputCategory" placeholder="Categorie" type="text" name="inputCategory" value="<?php if ($editeaza) { echo $detaliiCarte["category"]; } ?>">

<label for="inputYear" class="control-label">Editura</label>

<input class="form-control" id="inputEditura" placeholder="Editura" type="text" name="inputPublisher" value="<?php if ($editeaza) { echo $detaliiCarte["publisher"]; } ?>">

<a class="btn btn-sm btn-default "href="/test/listacarti.php">Salveaza</a>

<a class="btn btn-sm btn-default "href="/test/listacarti.php">A nuleaza</a>

</form>

Pagina care afișează toate cărțile aflate în bibliotecă conține și un formular pentru filtrare, astfel se poate afla foarte ușor dacă o carte de la o anumită editură, categorie, sau an există în bibliotecă.

Filtrarea cărților se face prin apelarea funcției getFilteredBooks care are ca parametrii titlul, autorul, anul, editura și categoria unei cărți care se dorește a fi gasită.

function getFilteredBooks($title, $author, $year, $category, $publisher, $available = false){

$db=getConnection();

$where_clause = createWhereClause($title, $author, $year, $category, $publisher, $available);

$sql = "SELECT b.id, b.title, b.author, b.year, c.name AS category, p.name AS publisher FROM books b INNER JOIN category c ON b.category_id = c.id INNER JOIN publishers p ON b.publisher_id = p.id" . $where_clause;

if(!$result = $db->query($sql)){

die('There was an error running the query [' . $db->error . ']');

}

if ( $result->num_rows) {

while($row = $result->fetch_assoc()){

$roww['id']=$row['id'];

$roww['title']=$row['title'];

$roww['author']=$row['author'];

$roww['year']=$row['year'];

$roww['publisher']=$row['publisher'];

$roww['category']=$row['category'];

$arr[]=$roww;

}

return $arr;

}

return array();

}

Deoarece nu se știe de la început care parametrii vor fi introduși trebuie verificați pentru a crea interogarea finală.

Funcția care crează clauza WHERE este următoarea:

function createWhereClause($title, $author, $year, $category, $publisher, $available){

$sql=" WHERE ";

$where_id=0;

if ($title != "") {

$sql .="b.title LIKE '%$title%'";

$where_id=1;

}

if($author !=""){

if($where_id != 0){

$sql .= " AND b.author LIKE '%$author%'";

}

else{

$where_id=1;

$sql .="b.author LIKE '%$author%'";

}

}

if($year !=""){

if($where_id != 0){

$sql .= " AND b.year LIKE '$year'";

}

else{

$where_id=1;

$sql .="b.year LIKE '$year'";

}

}

if($category !=""){

$c=strtoupper($category);

$q_category="SELECT c.id AS category_id FROM category c WHERE UPPER(c.name) LIKE '%$c%'";

if(!$result = $db->query($q_category)){

die('There was an error running the query [' . $db->error . ']');

}

$i=0;

$categories_list="-1";

while($row = $result->fetch_assoc()){

$categories_list .= ", " . $row['category_id'];

}

if($where_id != 0){

$sql .= " AND b.category_id IN ( $categories_list )";

}

else{

$where_id=1;

$sql .="b.category_id IN ( $categories_list )";

}

}

if($publisher !=""){

$p=strtoupper($publisher);

$q_publisher = "SELECT p.id AS publisher_id FROM publishers p WHERE UPPER(p.name) LIKE '%$p%'";

if(!$result = $db->query($q_publisher)){

die('There was an error running the query [' . $db->error . ']');

}

$i=0;

$publishers_list="-1";

while($row = $result->fetch_assoc()){

$publishers_list .= ", " . $row['publisher_id'];

}

if($where_id != 0){

$sql .= " AND b.publisher_id IN ( $publishers_list )";

}

else{

$where_id=1;

$sql .="b.publisher_id IN ( $publishers_list )";

}

}

if ( $available == true) {

if($where_id != 0){

$sql .= " AND b.id NOT IN ( SELECT l.book_id FROM loans l WHERE l.returned = 0 )";

}

else{

$where_id=1;

$sql .="b.id NOT IN ( SELECT l.book_id FROM loans l WHERE l.returned = 0 )";

}

}

if($where_id == 0){

$sql .= "1=1";

}

return $sql;

}

Pentru câmpurile autor, titlu și an se verifică doar dacă există și dacă sunt diferite de null se adaugă în clauza WHERE pentru că ele sunt stocate direct în tabela books, categoria și editura sunt stocare prin id-ul unic. Pentru categorie se interoghează baza de date, respectiv tabela category de unde se returneaza id-urile categoriilor ale căror nume conțin ceea ce a introdus utilizatorul în formularul de filtrare. Similar se procedează și pentru editură.

5.2.4. Listă cititori

Lista Cititori este o listă care își ia datele pentru fiecare cititor introdus din Adauga Cititor. Pagina Lista Cititori Activi conține butoanele Vezi fisa, Editează, Sterge.

<form action="adaugacititor-action.php" onsubmit="return validateForm();" method="get">

<input id="inputNume" placeholder="Nume" type="text" name='inputNume' >

<input id="inputPrenume" placeholder="Prenume" type="text" name="inputPrenume">

<input id="inputCNP" placeholder="CNP" type="text" name="inputCNP">

<input id="inputAdresa" placeholder="Adresa" type="text" name="inputAdresa">

<button center" type="submit" name="editeaza">Editeaza</button>

<button center" type="submit" name="anuleaza">Anuleaza</button>

</form>

function editReader($id, $last_name, $first_name, $cnp, $address){

$db=getConnection();

$q_add_new_reader="UPDATE readers SET first_name = '$first_name', last_name = '$last_name', cnp = '$cnp', address = '$address' WHERE id = '$id' ";

if(!$result = $db->query($q_add_new_reader)){

die('There was an error running the query [' . $db->error . ']');

}

}

Butonul Sterge șterge un cititor din Lista Cititori Activi și – l trece în Lista Cititori ”Expirati” :

function db_stergeCititor( $id ){

$db=getConnection();

$return_book="UPDATE readers r SET r.disabled = 1 WHERE r.id = '$id'";

if(!$result = $db->query($return_book)){

die('There was an error running the query [' . $db->error . ']');

}

}

Cititorii existenți în baza de date sunt împărțiți în 2 liste separate: lista cititorilor activi, și lista cititorilor „expirati”. În cea de-a doua categorie intră cititorii care nu mai pot împrumuta carți din diferite motive.

Paginile care afișează listele de cititori conțin câte un formular prin care se poate efectua o filtrare eficientă.

Funcția care filtreaza cititorii în funcție de datele introduse în formular este următoarea:

function getFilteredReaders( $last_name, $first_name, $cnp, $address ,$disabled){

$db=getConnection();

if ($disabled == 1) {

$sql = "SELECT * FROM readers r WHERE r.first_name LIKE '%$first_name%' AND r.last_name LIKE '%$last_name%' AND r.cnp LIKE '%$cnp%' AND r.address LIKE '%$address%' AND r.disabled = 1 ORDER BY r.last_name";

}else{

$sql = "SELECT * FROM readers r WHERE r.first_name LIKE '%$first_name%' AND r.last_name LIKE '%$last_name%' AND r.cnp LIKE '%$cnp%' AND r.address LIKE '%$address%' AND r.disabled = 0 ORDER BY r.last_name";

}

if(!$result = $db->query($sql)){

die('There was an error running the query [' . $db->error . ']');

}

if ( $result->num_rows) {

while($row = $result->fetch_assoc()){

$roww['id']=$row['id'];

$roww['first_name']=$row['first_name'];

$roww['last_name']=$row['last_name'];

$roww['cnp']=$row['cnp'];

$roww['address']=$row['address'];

$arr[]=$roww;

}

return $arr;

}

return array();

}

Ultimul parametru disabled se folosește pentru a identifica tipul de cititori doriți: 0 cititori activi, 1 – cititori expirați.

Pentru fiecare dintre cititorii activi există trei butoane: Vezi fisa, Editeaza și Sterge.

Butonul Vezi fisa duce către o pagină care conține toate informațiile despre cărțile împrumutate de acel cititor:

Se poate observa că există 2 liste: una care conține cărțile pe care le are împrumutate în acest moment cititorul, și una care conține toate cărțile pe care cititorul le-a împrumutat în trecut.

Pentru afișarea celor doua liste se apelează funcția: getHistoryForId, care are ca parametrii id-ul cititorului pentru care se dorește afișarea cărților iîprumutate, și un parametru $ret prin care se specifică dacă se doresc cărțile împrumutate în acest moment, sau cele care au fost împrumutate în trecut și returnate.

function getHistoryForId($id, $ret){

$db=getConnection();

if ( $ret == true ) {

$sql = "SELECT t1.start_date, t1.end_date, t1.returned, t2.id, t2.author, t2.title, t2.year, p.name AS publisher FROM loans t1 INNER JOIN books t2 ON t1.book_id = t2.id INNER JOIN publishers p ON t2.publisher_id = p.id WHERE t1.returned = 1 AND t1.reader_id = $id ORDER BY t1.end_date DESC";

}

else{

$sql = "SELECT t1.start_date, t1.end_date, t1.returned, t2.id, t2.author, t2.title, t2.year, p.name AS publisher FROM loans t1 INNER JOIN books t2 ON t1.book_id = t2.id INNER JOIN publishers p ON t2.publisher_id = p.id WHERE t1.returned = 0 AND t1.reader_id = $id ORDER BY t1.end_date-CURDATE() ASC";

}

if(!$result = $db->query($sql)){

die('There was an error running the query [' . $db->error . ']');

}

while($row = $result->fetch_assoc()){

$roww['id']=$row['id'];

$roww['title']=$row['title'];

$roww['author']=$row['author'];

$roww['year']= $row['year'];

$roww['publisher']=$row['publisher'];

$roww['start_date']=$row['start_date'];

$roww['end_date']=$row['end_date'];

$roww['returned']=$row['returned'];

$arr[]=$roww;

}

return $arr;

}

Butonul Imprumuta carte duce către o pagină care conține o listă cu toate cărțile disponibile în acel moment pentru a fi împrumutate. Pe acea pagină există de asemenea posibililitatea de a filtra cărțile dupa autor, titlu, an, categorie, editură.

După ce se găsește cartea cautată se apasă butonul împrumută care duce la o nouă pagină unde se va finaliza procesul de împrumutare a unei cărți.

Pe această pagină sunt prezente detaliile cărții pe care cititorul dorește să o împrumute și un câmp care trebuie completat cu numărul de zile pentru împrumut. Dupa ce se apasă butonul împrumută se apelează funcția loanBook care are ca parametrii id-ul cititorului, id-ul cărții și numărul de zile pentru care se dorește împrumutul.

function loanBook($idReader, $idBook, $days){

$db=getConnection();

$startDate = date("Y-m-d");

$startDateI = strtotime(date("Y-m-d"));

$endDateI = $startDateI + 3600 * 24 * $days;

$endDate = date('Y-m-d', $endDateI);

$loan_book="INSERT INTO loans( reader_id, book_id, start_date, end_date, returned) VALUES ('$idReader', '$idBook', '$startDate', '$endDate', '0')";

if(!$result = $db->query($loan_book)){

die('There was an error running the query [' . $db->error . ']');

}

}

Această funcție calculează data de returnare a cărții pornind de la ziua curentă și adaugând numărul de zile primit ca parametru. Se introduce o noua înregistrare în tabela loans(care conține istoricul tuturor împrumutorilor) continând id-ul cărții, id-ul cititorului, data curentă, și respectiv data la care trebuie returnată cartea.

Exista si posibilitatea de a prelungi perioada de imprumut a unei carti. Cand se apasa pe butonul Prelungeste se afiseaza o pagina care contine toate detaliile despre cartea imprumutata, cât si un camp care trebuie completat cu numarul de zile pentru care se doreste prelungirea imprumutului curent.

Funcția care salvează în baza de date numărul de zile cu care a fost prelungit împrumutul este următoarea:

function loanBookExtend( $idReader, $idBook, $days , $end_date_old){

$db=getConnection();

$endDateI = strtotime($end_date_old) + 3600 * 24 * $days;

$endDate = date('Y-m-d', $endDateI);

$loan_book="UPDATE loans l SET l.end_date = '$endDate' WHERE l.reader_id = '$idReader' AND l.book_id = '$idBook'";

if(!$result = $db->query($loan_book)){

die('There was an error running the query [' . $db->error . ']');

}

}

După ce se apasă butonul Prelungeste se ajunge din nou la pagina cu istoricul tuturor împrumuturilor pentru acel cititor, care va conține noile informații despre împrumutul caruia i-a fost extinsă perioada.

Dacă se dorește returnarea unei cărți se apasă butonul Returneaza, care va apela functia:

function returnBook($idReader, $idBook){

$db=getConnection();

$return_book="UPDATE loans SET returned = 1 WHERE reader_id = $idReader AND book_id = $idBook";

if(!$result = $db->query($return_book)){

die('There was an error running the query [' . $db->error . ']');

}

}

Aceasta editează câmpul returned din tabela loans, setându-i valoarea 1, ceea ce înseamnă că cititorul a returnat cartea respectivă.

După ce se apasă butonul returnează se actualizează listele cărților împrumutate de acel cititor, respectiv cartea care a fost returnată va dispărea din lista cărților împrumutate în acest moment și va apărea în lista cărților returnate.

Dacă un cititor are o carte nereturnată la timp, atunci el nu va mai avea dreptul de a împrumuta o nouă carte, butonul de Imprumuta Carte fiind dezactivat. Deasemenea va

apărea un mesaj de eroare.

Funcția care verifică dacă un cititor are cărți restante este următoarea:

function userHasUnrerurnedBooks( $id ){

$db=getConnection();

$sql = "SELECT l.reader_id FROM loans l WHERE l.returned = 0 AND l.reader_id = '$id' AND l.end_date < CURDATE() ";

if(!$result = $db->query($sql)){

die('There was an error running the query [' . $db->error . ']');

}

if ( $result->num_rows){

return 0;

}

return 1;

}

Deasemenea dacă un cititor are deja împrumuate trei cărți el nu va mai putea împrumuta altă carte până în momentul în care returnează o carte. Se va afișa și un mesaj de eroare care precizează din ce motiv nu se poate împrumuta o nouă carte.

Funcția care verifică dacă un cititor are deja 3 cărți împrumutate la momentul curent este următoarea:

function db_canLoan($id){

$db=getConnection();

$sql = "SELECT l.id FROM loans l WHERE l.reader_id = '$id' AND l.returned = 0";

if(!$result = $db->query($sql)){

die('There was an error running the query [' . $db->error . ']');

}

if ( $result->num_rows <3) {

return 1;

}

return 0;

}

Pagina Carti Restante o listă cu cititorii care au depășit perioada de împrumut pentru o carte. Pe această pagină există două butoane Vezi Fisa și Șterge Cititor. Vezi Fisa te duce la cărțile împrumutate de cititorul respectiv în acel moment cu posibilitatea de a prelungi sau a returna cartea :

function returnBook($idReader, $idBook){

$db=getConnection();

$return_book="UPDATE loans SET returned = 1 WHERE reader_id = $idReader AND book_id = $idBook";

if(!$result = $db->query($return_book)){

die('There was an error running the query [' . $db->error . ']');

}

}

Dacă un cititor a fost șters prin alegerea butonului Sterge Cititor, pentru că nu și –a predat cărțile la timp, din lista de cititori activi, el ajunge în lista de cititori ”expirați”, iar activarea lui se poate face prin apelarea butonului Activeaza din Lista Cititori ”Expirati”.

function db_activeazaCititor( $id ){

$db=getConnection();

$return_book="UPDATE readers r SET r.disabled = 0 WHERE r.id = '$id'";

if(!$result = $db->query($return_book)){

die('There was an error running the query [' . $db->error . ']');

}

}

Carti Nereturnate este o pagină ce conține cititorii și cărțile și zilele rămase pentru fiecare cititor în parte :

<table class="table table-striped table-hover">

<thead>

<tr>

<th>#</th>

<th>Nume</th>

<th>Prenume</th>

<th>Titlul Cartii</th>

<th>Zile depasite</th>

</tr>

</thead>

<tbody>

<?php

$id=0;

if(is_array($list))

foreach ($list as $value){

$reader_id=$value['reader_id'];

$row="<tr>" .

"<td>" . ++$id . "</td>" .

"<td>" . $value['last_name'] . "</td>" .

"<td>" . $value['first_name'] . "</td>" .

"<td>" . $value['title'] . "</td>" .

"<td>" . $value['days'] . "</td>" .

"<td>" . "<a class=\"btn btn-sm btn-default\" href=\"/test/istoric.php?id=$reader_id\">Vezi Fisa</a> " . "</td>" .

"</tr>";

echo $row;

}

?>

</tbody>

</table>

function getAllUnreturnedBooks(){

$db=getConnection();

$sql = "SELECT r.first_name, r.last_name, b.title, l.id, l.reader_id, DATEDIFF( l.end_date,CURDATE() ) AS days FROM loans l INNER JOIN readers r ON r.id = l.reader_id INNER JOIN books b ON b.id = l.book_id WHERE l.returned = 0 ORDER BY days ASC";

if(!$result = $db->query($sql)){

die('There was an error running the query [' . $db->error . ']');

}

if ( $result->num_rows) {

while($row = $result->fetch_assoc()){

$roww['id']=$row['id'];

$roww['reader_id']=$row['reader_id'];

$roww['first_name']=$row['first_name'];

$roww['last_name']=$row['last_name'];

$roww['days']=$row['days'];

$roww['title']=$row['title'];

$arr[]=$roww;

}

return $arr;

}

return array();

}

Aceată pagină conține butonul Vezi Fisa care duce la istoricul cărților împrumutate de cititorul respective cu posibilitatea de returnare sau prelungire :

LIMBAJE PENTRU BAZE DE DATE

Împreună cu fiecare model de date sunt necesare anumite limbaje pentru a defini schemele de reprezentare și pentru a efectua operații cu datele memorate în concordanță cu schemele. Sunt uzitate astfel, următoarele tipuri de limbaje :

Limbaj de definire a datelor (DDL) – este un limbaj pentru definirea schemei conceptuale;

Limbaj pentru manipularea datelor (DML);

Limbaj pentru memorarea datelor (SDL).

  Pentru interacțiunile utilizatorilor cu baza de date este necesar un limbaj prietenos, cu o sintaxă simplă, numit limbaj de interogare (QL). În ciuda numelui său, un limbaj de interogare include facilități pentru inserarea, ștergerea și modificarea datelor din baza de date. În cazul modelului relațional, abordarea folosită constă în a încorpora toate aceste facilități cerute într-o sintaxă uniformă, în cadrul unui singur limbaj. Standardul cel mai cunoscut este SQL.

 Limbajul numit SQL (Structured Query Language) este utilizat intens în prelucrarea bazelor de date structurate conform modelului relațional. Unul din motivele popularității de care se bucură acest limbaj este faptul că el a fost standardizat de American National Standards Institute (ANSI). În plus, limbajul a fost inițial dezvoltat și comercializat de IBM, ceea ce i-a asigurat o mare răspândire. Principala aplicație în limbajul SQL, efectuată de utilizator, este interogarea bazei de date.

Printr-o singură instrucțiune SQL se poate exprima o interogare care presupune o secvență de operații SELECT, PROJECT și JOIN, nefiind necesară o anumită ordine a acestora. Deși forma de exprimare a unei instrucțiuni SQL pare a fi imperativă, în esență instrucțiunea este de tip declarativ. Drept urmare limbajul SQL îl scutește pe utilizator de necesitatea dezvoltării unei secvențe de pași care trebuie parcurși pentru obținerea informației dorite – tot ce are de făcut este să descrie informația de care are nevoie.

Majoritatea instrucțiunilor din SQL sunt executabile, ele putând fi interpretate și executate imediat în mod interactiv sau putând fi incluse în diferite aplicații scrise în limbaje de programare cum sunt APL, BASIC, C, COBOL, FORTRAN, PL/I, ASSEMBLER, etc., executându-se în momentul rulării programului respectiv.

6.1. limbajul mysql

6.1.1. descriere

Bazele de date sunt folosite pentru stocarea informațiilor în vederea furnizării ulterioare în funcție de solicitarea primită.

MySQL este un sistem de baze de date funcțional independent.

În PHP există funcții pentru toate operațiile executate asupra bazelor de date MySQL.

Administrarea MySQL se poate face din linie de comandă sau folosind browserul și accesând aplicația numita PHPMyAdmin scrisă în PHP.

6.1.2. Operații asupra bazelor de date

Cele mai uzuale operații cu bazele de date sunt:

6.1.3. Tipuri de date MySQL

În MySQL spațiul alocat pe discul serverului este funcție de tipul de date. Câteva din tipurile de date folosite în bazele de date MySQL sunt:

Pentru ca baza de date să fucționeze mai bine coloanelor li s-au adăugat modificatori de coloană.

Tipul de date întregi încep de la valori negative la pozitive. Dacă se adaugă opțiunea UNSIGNED, care este un modificator de coloană, nu vor mai fi valori negative ci vor începe de la 0.

Alți modificatori sunt:
_INCREMENT functionează cu orice tip întreg. La fiecare rând nou adaugat în baza de date numărul asociat va fi incrementat.

NULL înseamnă fără valoare (diferit de spatiu sau zero).
NOT NULL înseamnă că orice înregistrare va fi considerată ceva.
PRIMARY este rolul primei coloane din tabel, totodată reprezentând elementul de referință pentru fiecare linie.

6.1.4. Comenzi elementare MySQL

Cele mai frecvent utilizate comenzi MySQL sunt prezentate în coloana de mai jos. Ele sunt mult mai multe, dar aici voi face o scurtă prezentarea lor.

Deși MySQL are suport pentru diacritice și setul de caractere 8859-2, este preferabil să nu folosiți diacritice în numele bazelor de date, tabelelor sau câmpurilor. De asemenea, nu puteți folosi ca nume de tabel sau de câmp cuvinte rezervate (nume de funcții, tipuri de caractere din MySQL precum CREATE, DROP sau COLUMN). Se pot folosi nume de tabele care conțin spații dar în practică trebuie să încadrați numele între back-ticks ` (semnul ` îl găsiți pe tasta aflată imediat sub Escape și înainte de 1).

Exemplu:
CREATE TABLE `tabel al carui nume are spatii` (`camp 1`, TEXT);
SHOW COLUMNS FROM `tabel al carui nume are spatii`;

Semnul * este definit în MySQL ca însemnând tot/toate.

Semnul % este folosit în interogările MySQL dacă vrem să găsim cuvântul oriunde în cadrul textului. Mai exact:

%cuvant_cautat – dacă vrem să afișeze toate cuvintele care se termină cu 'cuvantul_cautat' (pot fi și câteva caractere)

cuvant_cautat% – afișează toate cuvintele care încep cu 'cuvantul_cautat'
%cuvant_cautat% – afișează toate cuvintele care conțin 'cuvantul_cautat' oriunde în text.

Putem afla câte înregistrări sunt pentru un criteriu de selecție cu ajutorul lui count(). Putem afla astfel câte înregistrări sunt în total în tabel sau câte înregistrări sunt în tabel al căror câmp este cel cautat… Cu ajutorul instrucțiunii GROUP BY putem "grupa" rezultatele astfel încât să nu vedem duplicatele și să vedem doar valorile unice. Pentru a limita numărul începând de la înregistrarea 10 încă 5 înregistrări).
Pentru ștergerea înregistrărilor dintr-un tabel se folosește comanda DELETE. Pentru ștergerea unui tabel sau a unei baze de date comanda este DROP.

Comanda UPDATE se folosește când vrem să modificăm conținutul unei înregistrări fără a o șterge. Dacă dorim să schimbăm structura unui tabel existent sau să adăugăm alte coloane folosim comanda ALTER TABLE.

INDECSI – Cel mai folosit tip de index este id-ul. Id-ul este un număr unic de identificare pentru un element distinct (un rând) al unui tabel. Un exemplu de id din viața reală este numerotarea cd-urilor. Când aveți un cd nou îl numerotați și îl puneți în raft la sfârșit iar în catalog puteți să îl puneți sortat după titlu sau după numărul de ordine. La fel și într-o bază de date, puteți crea un câmp care să introducă automat un nr pentru fiecare rând nou adăugat în baza de date și la afișare puteți să îl folosiți .

Pentru a creea un index avem următoarele comenzi:

Să zicem că avem o bază de date numită lista cu un câmp caseta și adăugăm câmpul id_casete – comanda este următoarea:

ALTER TABLE `caseta` ADD `id_caseta` INT;

ALTER TABLE `caseta` CHANGE `id_caseta` `id_caseta` INT(11) UNSIGNED NOT NULL;

ALTER TABLE `caseta` ADD PRIMARY KEY (id_caseta);

ALTER TABLE `caseta` CHANGE `id_caseta` `id_caseta` INT(11) UNSIGNED DEFAULT "0" NOT NULL AUTO_INCREMENT;

Și din acest moment, orice casetă nouă introdusă va avea automat un nr de ordine. Este posibil ca toată înșiruirea de comenzi de mai sus să se poată face printr-o singură linie de cod, dar este mai sigur să faceți câte o modificare în parte decât toate odată, pentru a detecta eventualele erori. Este bine să creați un id la începutul tabelului, când nu aveți intrări în baza de date, pentru a face incrementarea automat, altfel e posibil să vă dea erori. Cu ajutorul id-ului puteți afișa de exemplu noutațile, cu o comandă de genul – afișează ultimele 10 intrări sortate după id…, știind că întotdeauna ultima intrare are numărul cel mai mare.

MySQL stochează fizic datele unui tabel într-un fișier pe hard disc și cu cât tabelul e mai mare, cu atât mărimea acestui fișier crește. Versiunea 3.22 a MySQL are o limită de 4 GB pentru mărimea unui tabel. În versiunile superioare această limită este extinsă până la 8 milioane TB pentru tipul de tabel MyISAM. Cu toate acestea, sistemele de operare pot avea propriile limitări ale mărimii fișierelor. Mărimea impicită a tabelelor MySQL este de aproximativ 4 GB.

6.2. HTML – HYPERTEXT MARKUP LANGUAGE

Redus la esență, Limbajul de Marcare HiperText (HiperText Markup Language – HTML) este un set de coduri speciale care se inserează într-un text, pentru a adăuga informații despre formatarea și despre legături. HTML se bazează pe Limbajul Generalizat Standard de Marcare ( Standard Generalized Markup Language – SGML).

Pentru a învăța HTML trbuie următoarele:

să știi să utilizezi un editor de text (ex: Notepad etc.)

să ai cel puțin un browser de internet (ex: Microsoft Internet Explorer, Netscape Comunicator etc.)

să înveți comenzile, atributele necesare limbajului HTML

Structura unui document HTML

Despre taguri

Tag-urile sunt niște marcaje sau etichete pe care limbajul HTML le folosește alături de texte pentru a ajuta browser-ul de internet să afișeze corect conținutul paginii web.

Aceste tag-uri (etichete) pot fi de două feluri:

tag-uri pereche (un tag de început și unul de încheiere). Exemple: <HTML> si </HTML>; <TITLE> si </TITLE>; <HEAD> si </HEAD>;

tag-uri singulare (nu au un tag de încheiere) Exemple: <HR>, <BR>.

<HTML> – cu acest tag începe orice document HTML. Prin folosirea acestui tag îi spunem browser-ului că este vorba de un fișier HTML pentru a-l putea afișa.

<HEAD> și </HEAD> – între aceste taguri sunt trecute, pe lângă titlul paginii, diverse informații folositoare pentru browser-ul de internet.

<TITLE> și </TITLE> -cu ajutorul acestor perechi de taguri vom putea da un titlu documentului nostru. Astfel, textul pe care îl vom scrie între aceste tag-uri va fi afișat în bara de titlu a documentului.

<BODY> – odată cu acest tag începe conținutul paginii web

<BODY> și </BODY> -tot ce se scrie între aceste tag-uri va fi afișat de către browser, pe ecranul monitorului.

</HTML> – este tag-ul de încheiere al tag-ului <HTML>. Codul oricărui document se termină cu acest tag.

Tag-urile (etichetele) pot fi scrise atât cu litere mari cât și cu litere mici.

Atribute HTML

Atributele sunt niște proprietăți ale tag-urilor. Atributele se pun numai în tag-ul de început. Dacă un tag nu are nici un atribut, atunci browser-ul va lua în considerare valorile implicite ale tag-ului respectiv.

<BODY BGCLOR=”red”> -afișează fundalul de culoare roșu.

<BODY LEFTMARGIN=”100” TOPMARGIN=”50”>

“LEFTMARGIN” – stabilește distanța dintre marginea stângă a ferestrei browser-ului și marginea stângă a conținutului paginii.

“TOPMARGIN” – stabilește distanța dintre marginea de sus a ferestrei browser-ului și marginea de sus a conținutului paginii.

<BODY TEXT> -culoarea textului

<BODY ALINK> – culoarea legăturilor active (când mouse-ul se află deasupra lor)

<BODY LINK> – culoarea legăturilor nevizitate

<BODY VLINK> – culoarea legăturilor vizitate

<BR> – sfârșitul randului

<B> – text bold

</B> – sfârșitul textului bold

<I> – text italic

</I> – sfârșitul textului italic

<U> – text subliniat

</U> – sfârșitul textului subliniat

<STRONG> – text evidențiat

</STRONG> – sfârșitul textului evidențiat

<SUB> – text indice

</SUB> – sfârșitul textului indice

<SUP> – text exponent

</SUP> – sfârșitul textului exponent

<FONT COLOR=”blue” face=”times new roman” size=”10” align=”right”>

Color – culoare

Face – stil

Size – mărime

Align – aliniere

Left – stânga

Right – dreapta

Top – sus

Bottom – jos

Center – centru

Middle – mijloc

Width – lungime

<BLOCKQUOTE> ….</BLOCKQUOTE> – indentarea unui bloc de text

<xmp>…</xmp> (80 de caractere pe rând)

<listing>…</listing> (120 de caractere pe rând)

<p> – face posibilă trecerea la o linie nouă și permite

Inserarea unui spațiu suplimentar înainte de blocul paragraph

Inserarea unui spațiu suplimentar dupa blocul paragraph, dacă se folosește delimitatorul </p>

Alinierea textului cu ajutorul atributului “align”, având posibile “left”, “center” sau “right”.

<p align=”right”> – paragraph aliniat la dreapta

<p align=”center”> – paragraph aliniat în centru

<hr> – trasarea unei linii orizontale

“align” – ce permite alinierea orizontală a liniei. “left” sau “right”

“width” – permite alegerea lungimii liniei

“size” – permite alegerea grosomii liniei

“noshade” – când este prezent definește o linie fără umbră

“color” – permite definirea culorii liniei

Blocuri CENTER

<center>…</center> – aliniază centrat toate elementele pe care le conține

<center> <hr width=10%> <hr width=40%> <hr width=70%> <hr width=100%>

Blocuri de titlu

<H1> – permite scrierea unui titlu cu caractere mari și aladine

<H2> – permite scrierea unui titlu cu caractere mai mici decât <H1>

<H3> – permite scrierea unui titlu cu caractere mai mici decât <H2>

<H4> – permite scrierea unui titlu cu caractere mai mici decât <H3>

<H5> – permite scrierea unui titlu cu caractere mai mici decât t <H4>

<H6> – permite scrierea unui titlu cu caractere mai mici decât <H5>

Blocuri DIV

<div>…</div> – delimitează și formatează un bloc de text

“left” (aliniere la stânga)

“center” (aliniere centrată)

“right” (aliniere la dreapta)

<div align=”right”> – blocul este aliniat la dreapta

</div> – sfârșitul alinierii blocului de text

Imagini

< img src=”images/imagine1.jpg” border=”5” width=”350” align=”left” hspace=”30” vspace=”30”> – introducerea unei imagini

Border – bordura unei imagini

Width – lungimea

Height – lățimea

Align – aliniere

Hspace – distanța în pixeli pe orizontală dintre imagine și restul elementelor din pagină

Vspace – distanța în pixeli pe verticală dintre imagine și restul elementelor din pagină

<BODY BACKGROUND=”images/img1.jpg”> – utilizarea unei imagini pe post de fundal

Legături

< a href=”index.html”> <img src=”images/img1.jpg”> </a> – crearea unei legături dintre pagina “index.html” și imaginea “images/img1.jpg”

< a href=”pagina2.html”> Link catre pagina2</a> crearea unei legături dintre pagini din același director.

< a href =”http://www.netscape.com”> Netscape Corporation </a> – crează o legătura către un site particular

< a href=”fisier.zip”> Link către fișierul fisier.zip

Liste

<ol> – lista ordonată

<li> 1

<li> 2

<li> 3

</ol> – sfârșitul listei ordonate

<ul> – lista neordonată

<li> – marcator

<li> – marcator

<li> – marcator

</ul> – sfârșitul listei neordonate

<dl> – o listă de definiții

<dt> – marcajul B

<dd> – afișează text îngroșat

<dt> – marcajul I

<dd> – afișează text înclinat

<dt> – marcajul U

<dd> – afișează text subliniat

<ol type=1 start=11> – o listă care ia diferite valori

<li> atributul SIZE

<dd> specifică dimensiunea textului

</ol> sfârșitul listei

Tabele

<table>…</table> – inserarea unui table

<tr>…</tr> – inserarea unui rând

<td>…<td> – inserarea unei celule

< table align=”left”> – alinierea tabelului

Left

Right

Center

<table bgcolor=”aqua”> – culoarea de fond a tabelului

Dimensionarea celulei unui tabel se face cu următoarele atribute:

“cellspacing” – distanța dintre doua celule vecine

“cellpadding” – distanța dintre marginea unei cllule și conținutul ei

Dimensionarea unui tabel se face cu atributele:

“width” – lățimea

“height” – înălțimea

Alinierea conținutului unei celule se face:

“align” pe orizontală cu valorile:

“left”

“center”

“right”

“char” – alinierea se face față de un character

“valign” pe verticală cu valorile:

“baseline” – la baza

“bottom” – jos

“middle” – la mijloc

“top” – sus

“colspan” – extinderea unei celule peste celulele din dreapta ei

“rowspan” – extinderea unei celule peste celulele de sub ea

Cadre

Blocul <body>…</body> este înlocuit de blocul <frameset>…</frameset> – în interiorul acestui bloc, fiecare cadru este introdus prin eticheta <frame>

<frame src=”p1.html”> – împărțirea ferestrei ecran și a subferestrelor în linii și coloane

“cols” – împărțirea unei ferestre într-un număr de subferestre de tip coloană

“rows” – împărțirea unei ferestre intr-un număr de subferestre de tip linie

“*,*” – o lista de elemente separate prin virgule care descriu modul în care se face împărțirea

<frameset cols=”*,*”>

<frame src=”p2.html”>

</frameset>

<frame src=”p2.html” bordercolor=”blue”> – culoarea chenarului unui cadru

Bare de defilare

<frame src=”p.html” scrolling=”yes” noresize> – adăugarea barei de defilare unui cadru

“yes” – barele de derulare sunt adăugate întotdeauna

“no” – barele de derulare nu sunt utilizabile

“auto” – barele de derulare sunt vizibile atunci când este necesar

“noresize – inhibă posibilitatea de a redimensiona cadrul cu ajutorul mouse-ului

“marginheight” – permite stabilirea distanței în pixeli dintre conținutul unui cadru și marginile verticale

“marginwidth” – permite stabilirea distanței în pixeli dintre conținutul unui cadru și marginile orizontale

Formulare

Un formular este un ansamblu de zone active alcătuit din butoane, casete de selecție, câmpuri de editare.

<form> …</form>

“action” – precizează ce se va întâmpla cu datele formularului odată ce acestea ajung la destinație

“method” – precizează metoda utilizată de browser pentru expedierea datelor formularului

“name” – permite atasarea unui nume fiecarui element al formularului

“value” – permite atribuirea unei valori inițiale unui element al formularului

“get” – datele sunt adaugate la adresa URL precizata de atributul “Action”

“post” – datele sunt expediate separate

“type” – un buton de expediere al unui formular

CONCLUZII

În contextul actual când evoluția societății din ultimele decenii se bazează pe dezvoltarea tehnologiei informatice, oamenii preferă, să utilizeze calculatorul datorită multitudinilor sale de opțiuni ță servicii oferite.

Sunt multe modalități prin care calculatorul poate fi util. Tehnologia informației și a comunicării oferă numeroase posibilități de ameliorare a serviciilor de bibliotecă prin îmbunătățirea accesului la informație, cunoștințe și cultură. Din păcate implementarea noilor tehnologii nu se face în mod sistematic și eficient prin crearea unor rețele bine coordonate cu servicii centralizate, care ar conduce la economisirea a numeroase resurse materiale și umane.

O bibliotecă presupune o bună organizare și administrarea tuturor elementelor sale, cu scopul de a satisface cerințele cititorilor într – un timp cât mai scurt și în mod normal cât mai eficient.

De aceea am ales să realizez un sistem informatic care să ajute utilizatorul să gestioneze mult mai ușor cărțile și să țină evidența cititorilor dintr-o bibliotecă.

Acest program va ușura munca bibliotecarului, acesta confruntându-se cu un număr mare de cărți, autori, împrumuturi, restituiri, adăugiri și eliminări de cărți/cititor din bibliotecă. El poate fi folosit de orice bibliotecă, atât de specialiști cât și de nespecialiști fiind un (program) sistem accesibil ce poate fi utilizat cu succes într – o bibliotecă școlară.

Generația actuală de bibliotecari are de înfăptuit schimbarea Modelului Biblioteconomic Tradițional și crearea Modelului Biblioteconomic Modern, care să corespundă tendințelor actuale de dezvoltare a societății, de aici și responsabilitățile imense care stau pe umerii înaintașilor domeniului, responsabilității inerente acestei perioade de tranziție.

Ca instituții de informare și cunoaștere, bibliotecile școlare se numără, probabil, printre instituțiile din sectorul public care sunt implicate cel mai activ în difuzarea informației.

În condițiile Erei Digitale, bibliotecile se transformă din instituții mai mult sau mai puțin închise, în instituții cu acces deschis.

Într-o bibliotecă, sursele tradiționale specifice se îmbogățesc cu surse noi, bazate pe tehnologie modernă: documentele primare clasice se completează cu documente electronice; catalogului tradițional îi corespunde varianta sa modernă – catalogul online; lucrările bibliografice tradiționale sunt completate cu bazele de date bibliografice.

BIBLIOGRAFIE

Valeriu Lupu, Baze de date – Curs pentru învățământ la distanță, Suceava, 2010

Manifestul IFLA/UNESCO pentru Bibliotecile școlare, 2005

http://www.referat.ro/referate/download/HTML_Hypertext_Markup_Language_f5e61.html

Similar Posts