Sistem Informatic Pentru Evidenta Bibliotecara

Cuprins

Introducere………………………………………………………………………………………………………………….7

1. Biblioteca……………………………………………………………………………………8

2. Generalitățile bazelor de date……………………………………………………………………………………12

2.1. Arhitectura unei baze de date…………………………………………………………………………….12

2.1.1. Avantajele bazelor de date…………………………………………………………………………13

2.1.2. Arhitectura unei baze de date……………………………………………………………………..14

2.1.3. Administratorul unei baze de date………………………………………………………………17

2.2. Modelul relațional……………………………………………………………………………………………18

2.2.1. Modelul entitate – asociere………………………………………………………………………..18

2.2.2. Domeniu, atribut, relație……………………………………………………………………………20

2.2.3. Cheie primară, cheie externă………………………………………………………………………22

2.2.4. Valori NULL……………………………………………………………………………………………24

2.2.5. Crearea unei baze de date relaționale în SQL……………………………………………….25

2.2.6. Încărcarea și actualizarea datelor………………………………………………………………..28

2.3. Instrucțiunea Select SQL…………………………………………………………………………………31

2.3.1. Selectarea unor informații dintr-o tabelă……………………………………………………..32

2.3.2. Funcții de agregare în interogări cu o singură tabelă…………………………………….33

2.3.3. Selectarea unor informații din mai multe tabele…………………………………………..36

2.3.4. Utilizarea instrucțiunii SELECT SQL în actualizare…………………………………….41

2.4. Proiectarea bazelor de date……………………………………………………………………………….42

2.4.1. Dependențe funcționale…………………………………………………………………………….43

2.4.2. Primele trei forme normale……………………………………………………………………….44

2.4.3. Proiectarea structurii unei baze de date……………………………………………………….46

3. Generalități despre limbajul PHP……………………………………………………..……48

4. Descrierea aplicației………………………………………………………………………………………………..52

4.1. Analiza problemei…………………………………………………………………………………………..57

4.2. Relațiile între tabele………………………………………………………………………………………..58

4.3. Crearea tabelelor ……………… …………………………………………………………………………..59

Concluzii și propuneri……………………………………………………………………………………………60

Bibliografie……………………………………………………………………………………………………………….61

Introducere

În prezent informația este o componentă esențială în desfășurarea oricărei activități. Informația trebuie să influențeze procesul de luare a deciziilor; acestea trebuie să fie mai bune decât cele care s-ar lua în absența informației. De aceea aceasta trebuie să fie disponibilă în timp util, să fie corectă, coerentă, neredundantă. Cum satisfacem aceste cerințe în condițiile în care volumul datelor care trebuie prelucrate este în continuă creștere? Sunt deci necesare sisteme care să asigure culegerea, memorarea, organizarea, regăsirea și prelucrarea acestora. Aceste activități sînt posibile în prezent și în informatică ele sînt legate nemijlocit de noțiunea de baze de date.

Aceasta aplicație este destinata utilizarii in bibiliotecile scolare univeristare cit si cele publice. Este un soft creat pe web care nu necesita din partea administratorului decit o conexiune la internet.

Aplicatia a fost scrisa in php versiunea 4.1 si mysql versiunea 4.0. Aplicatia este destinata gestiunii membrilor abonati ai unei biblioteci cit si a evidentei cartilor existente in aceasata biblioteca si a imprumuturilor catre abonati.

Aplicatia necesita o platform de rulare cu support php si mysql. Aplicatia a fost scris in acest limbaj deoarece este cel mai larg folosit limbaj de dezvoltare web cit si datorita faptului ca este cel mai accesibil limbaj atit ca si limbaj de dezvoltare cit si ca baza de date.

Sistem informatic pentru evidență bibliotecară

1. Biblioteca

Biblioteca este institutia, compartimentul sau structura specializata al carei scop principal este de a constitui, a organiza, a prelucra, a dezvolta si a conserva colectii de carti, publicatii periodice, alte documente specifice si baze de date pentru a facilita utilizarea acestora de catre persoane fizice (utilizatori) in scop de informare, cercetare, educatie sau recreere: in cadrul societatii informationale biblioteca are importanta strategica. Sunt incluse bibliotecile proprietate publica si privata. Se inregistreaza in seriile de date numai unitatile de baza, care au functionat in anul de referinta.

Tipurile de biblioteci sunt: nationale, universitare, publice (judetene, municipale, orasenesti si comunale), scolare, specializate (ale institutiilor academice si de cercetare, institutiilor publice centrale si locale, institutiilor de cultura si culte, ale operatorilor economici, sindicatelor, ale altor organizatii asociative).

Biblioteca nationala este parte integranta a sistemului informational national care produce, inmagazineaza, organizeaza, pune in valoare si difuzeaza informatii de interes public, local, national si international si detine colectii de documente formate in timp si dezvoltate permanent prin achizitii, schimb interbibliotecar, donatii si, dupa caz, depozit legal national sau local;

Biblioteca universitara este biblioteca aflata prioritar in serviciul studentilor, al cadrelor didactice si al cercetatorilor din universitati si alte institutii de invatamant superior si de cercetare care, in limitele regulamentului de organizare, poate functiona si ca biblioteca publica;

Biblioteca publica – biblioteca de tip enciclopedic pusa la dispozitia unei comunitati (judetene, municipale, orasenesti, comunale)
Biblioteca specializata este destinata in principal unei categorii de beneficiari sau colectionarii, cu prioritate, a unor tipuri de documente sau pentru a raspunde necesitatilor specifice organismului tutelar;

Biblioteca scolara este organizata in cadrul unei institutii de invatamant preuniversitar, care se afla cu precadere in serviciul elevilor si al cadrelor didactice din institutia respectiva si care, in limitele prevazute de lege si regulamentul de organizare, poate functiona si ca biblioteca publica. 

Accesul la informație, la știință și la cultură sunt drepturi fundamentale ale omului, care împreună cu dreptul la educație sunt recunoscute peste tot în lume ca elemente cheie ale unei dezvoltări durabile a umanității și a progresului economic și social.

(Conferința IFLA, Copenhaga, 1997)

O bibliotecă nu este un depozit inert, o comoară înghețată de valori nebănuite cuprinse sau expuse sistematic în rafturi, un templu babilonic care s-a înălțat de la unicatele manuscriselor, incunabulelor legate în lanțuri pentru a nu fi prădate în Evul Mediu, până la milioanele de exemplare, pe care le numără acum orice mare instituție similară din lume. O bibliotecă este un templu al lecturii, al discursului în tovărășia celor mai de seamă spirite ale culturii universale, de la îndepărtata Antichitate până la ultimii contemporani.

Biblioteca trebuie să fie un for de comunicare între cititori și aceia care creează sau pun în circulație cărțile.

Bibliotecarul este un element stimulator, care nu se mărginește a fi numai un custode al depozitului de gândire și artă, ci caută să fie un difuzor al culturii ce sălășluiește în incinta instituției cărților. El este un sacerdot al culturii cărții și nu poate fi decât un intelectual foarte informat și dinamic. El nu este un funcționar pasiv, ci un factor stimulator, care caută, cu orice prilej, să pună în mișcare cartea. El este un îndrumător al cititorului începător pe care îl poate modela prin sfaturile sale, în procesul evolutiv al lecturii, având mereu în fața ochilor, poate cea mai cuprinzătoare definiție a actului magic al lecturii, pe care a dat-o cronicarul român Miron Costin: …că nu iaste altă mai frumoasă și mai de folos în toată viața omului zăbavă, decât cetitul cărților…. Bibliotecarul trebuie să ducă o muncă într-adevăr diferențiată în raport cu profilul bibliotecii sale și al cititorilor care o frecventează. Corelând structura fondului de publicații cu setea și necesitățile de lectură ale cititorului, bibliotecarul utilizează cele mai variate modalități de activare specifică, totdeauna determinate de voința dezvoltării armonioase a personalității umane. Aria lui de investigație trebuie să fie servită de cele mai moderne metode și mijloace ale informării, grație cărora el trebuie să poată pune la îndemâna cititorului ultimul document, ultima cercetare.

Un bibliotecar trebuie să fie el însuși un mare, un pasionat cititor.

El trebuie să aibă permanent în vedere faptul că primirea cititorilor reprezintă o componentă esențială a muncii bibliotecarului, pentru că de modul în care cititorii sunt primiți depind numeroși factori legați de bunele raporturi ale bibliotecii cu utilizatorii săi. În relația cu cititorii este extrem de important aspectul uman. O bibliotecă, chiar cu acces liber, dar fără bibliotecar este tristă și rece.

Dialogul cu cititorii este un lucru de care trebuie să se țină seama în permanență. Primul contact are o importanță deosebită pentru că acesta contribuie la fixarea imaginii bibliotecii în spiritul noului beneficiar. O primire proastă are efecte dezastruase și de lungă durată. Pentru o bună primire a cititorului nu există reguli, ci exigențe umane. Bibliotecarul trebuie să dovedească tact, să cunoască psihologia cititorului, să fie discret, să aibă disponibilitatea și calmul de a-l asculta pe acesta. Este ideal să se dispună de un spațiu dedicat primirii și orientării cititorilor, unde să se afle în permanență un bibliotecar.

Serviciile culturale în general, serviciile de lectură, mai ales, prin finalitățile lor educative, satisfac nevoi și aspirații ale indivizilor și grupurilor sociale în perspectiva devenirii umane.

Încă din perioada tranziției, natura fenomenului lecturii se modifică profund. În primul rând se modifică cerințele de lectură ale cititorilor, ca efect al nevoilor lor sociale, economice, civice, spirituale. Se impune revitalizarea rolului bibliotecii, ca instrument important al dezvoltării umane. Mutațiile din domeniile economic și social se reflectă și la nivelul beneficiarilor serviciilor de lectură. Acești beneficiari vor fi reprezentați, din ce în ce mai mult de adulți de toate vârstele. Cerințele reconversiei forței de muncă, în condițiile economiei de piață, solicitând formare profesională continuă, abilitează lectura ca necesitate în orice moment al vieții active a indivizilor.

În al doilea rând se modifică natura serviciilor menite a satisface trebuințele de lectură. La cererile l lecturii, al discursului în tovărășia celor mai de seamă spirite ale culturii universale, de la îndepărtata Antichitate până la ultimii contemporani.

Biblioteca trebuie să fie un for de comunicare între cititori și aceia care creează sau pun în circulație cărțile.

Bibliotecarul este un element stimulator, care nu se mărginește a fi numai un custode al depozitului de gândire și artă, ci caută să fie un difuzor al culturii ce sălășluiește în incinta instituției cărților. El este un sacerdot al culturii cărții și nu poate fi decât un intelectual foarte informat și dinamic. El nu este un funcționar pasiv, ci un factor stimulator, care caută, cu orice prilej, să pună în mișcare cartea. El este un îndrumător al cititorului începător pe care îl poate modela prin sfaturile sale, în procesul evolutiv al lecturii, având mereu în fața ochilor, poate cea mai cuprinzătoare definiție a actului magic al lecturii, pe care a dat-o cronicarul român Miron Costin: …că nu iaste altă mai frumoasă și mai de folos în toată viața omului zăbavă, decât cetitul cărților…. Bibliotecarul trebuie să ducă o muncă într-adevăr diferențiată în raport cu profilul bibliotecii sale și al cititorilor care o frecventează. Corelând structura fondului de publicații cu setea și necesitățile de lectură ale cititorului, bibliotecarul utilizează cele mai variate modalități de activare specifică, totdeauna determinate de voința dezvoltării armonioase a personalității umane. Aria lui de investigație trebuie să fie servită de cele mai moderne metode și mijloace ale informării, grație cărora el trebuie să poată pune la îndemâna cititorului ultimul document, ultima cercetare.

Un bibliotecar trebuie să fie el însuși un mare, un pasionat cititor.

El trebuie să aibă permanent în vedere faptul că primirea cititorilor reprezintă o componentă esențială a muncii bibliotecarului, pentru că de modul în care cititorii sunt primiți depind numeroși factori legați de bunele raporturi ale bibliotecii cu utilizatorii săi. În relația cu cititorii este extrem de important aspectul uman. O bibliotecă, chiar cu acces liber, dar fără bibliotecar este tristă și rece.

Dialogul cu cititorii este un lucru de care trebuie să se țină seama în permanență. Primul contact are o importanță deosebită pentru că acesta contribuie la fixarea imaginii bibliotecii în spiritul noului beneficiar. O primire proastă are efecte dezastruase și de lungă durată. Pentru o bună primire a cititorului nu există reguli, ci exigențe umane. Bibliotecarul trebuie să dovedească tact, să cunoască psihologia cititorului, să fie discret, să aibă disponibilitatea și calmul de a-l asculta pe acesta. Este ideal să se dispună de un spațiu dedicat primirii și orientării cititorilor, unde să se afle în permanență un bibliotecar.

Serviciile culturale în general, serviciile de lectură, mai ales, prin finalitățile lor educative, satisfac nevoi și aspirații ale indivizilor și grupurilor sociale în perspectiva devenirii umane.

Încă din perioada tranziției, natura fenomenului lecturii se modifică profund. În primul rând se modifică cerințele de lectură ale cititorilor, ca efect al nevoilor lor sociale, economice, civice, spirituale. Se impune revitalizarea rolului bibliotecii, ca instrument important al dezvoltării umane. Mutațiile din domeniile economic și social se reflectă și la nivelul beneficiarilor serviciilor de lectură. Acești beneficiari vor fi reprezentați, din ce în ce mai mult de adulți de toate vârstele. Cerințele reconversiei forței de muncă, în condițiile economiei de piață, solicitând formare profesională continuă, abilitează lectura ca necesitate în orice moment al vieții active a indivizilor.

În al doilea rând se modifică natura serviciilor menite a satisface trebuințele de lectură. La cererile individuale și foarte diferențiate ale beneficiarilor, ele vor trebui să ofere răspunsuri individualizate.

Un lucru important, direct legat de protecția culturii scrise, deopotrivă a producătorilor și a consumatorilor, este completarea colecțiilor, care se confruntă cu numeroase probleme: alocațiile bugetare nu sunt puse de acord cu evoluția prețurilor, sistemul de informare anticipativă ca și cel de difuzare sunt deficitare; modalitățile de plată exclusiv prin virament fac dificilă procurarea publicațiilor și cărților ce se desfac cu bani cash; sistemul de anticariat se pulverizează într-o multitudine de inițiative private, la prețuri necontrolate și în absența unor spații comerciale de profil, care să permită fluența informării, contactul ritmic și completarea retroactivă coerentă; alocațiile valutare pentru procurarea de cărți din import sunt în continuă scădere, nepermițând o viziune științifică și proiectivă în acest sens. Sunt aspecte asupra cărora compartimentele de specialitate din ministerele de resort ar trbui să mediteze, după cum serviciile metodice ale marilor biblioteci ar trebui să întreprindă studii de diagnoză și variante de programe pe care să le pună la dispoziția factorilor de decizie.

Al doilea aspect ce trebuie avut în vedere este asigurarea accesului publicului la publicații. și aceasta comportă două planuri: cel fizic și cel informațional. O simplă observație arată că afluxul de public în sălile bibliotecilor a crescut spectaculos în ultima vreme, determinat, în primul rând, de creșterea prețurilor la cărțile noi, căreia fondurile alocate nu-i pot face față, dar și de așezarea învățmântului pe alte baze, studiul individual câștigând în pondere. Au contribuit la aceasta, de bună seamă, și extinderea rețelei universitare în localități în care baza de informare o dețin, deocamdată, bibliotecile publice, interesul firesc față de o anumită literatură din fondurile tradiționale, până de curând inaccesibilă, ca și de cartea străină care, prin donații, dar și prin achiziții directe, a intrat masiv în colecțiile bibliotecilor, mișcarea profesiilor, diversificarea opțiunilor politice, implementarea economiei de piață, toate presupunând studiu și informare la zi. Însă capacitățile de primire ale bibliotecilor au rămas aceleași, ajungându-se în unele biblioteci la uluitorul și alarmantul indice de utilizare a unui loc la sala de lectură de patru. Nici depozitele și secțiile cu acces direct la raft nu mai fac față pentru o conservare corespunzătoare și o sistematizare funcțională a noilor achiziții.

O concluzie importantă este că accesul la o colecție diversă și mare din bibliotecă este unul din elementele esențiale în încurajarea copiilor să citească ca și faptul că motivația lecturii este determinată de cunoașterea acelor cărți care au un rol modelator asupra comportamentului. Există o relație directă între modul cum este stimulată motivația lecturii în școală și opțiunile pentru lectură ale elevului.

2. Generalitățile bazelor de date

În cadrul acestui capitol se prezintă fundamentele bazelor de date. Toate expunerile au un caracter general și nu fac referire la vreun SGBD particular. Este o încercare de a da în același timp o notă practică tuturor expunerilor, aceasta pentru a-i ajuta pe potențialii proiectanți de aplicații de baze de date să găsească soluții cât mai bune pentru problemele care se pun.

Structura capitolului este următoarea:

– arhitectura unei baze de date;

– modelul relațional: noțiunile de domeniu, atribut, relație, cheie primară, cheie externă; probleme legate de integritatea datelor; modelul entitate-asociere;

– limbajul SQL (partea I): descrierea datelor și prelucrarea acestora: inserare, modificare, ștergere;

– limbajul SQL (partea a II-a): instrucțiunea Select SQL – selecții dintr-o singură tabelă, din mai multe tabele și funcții de agregare;

– proiectarea bazelor de date: dependențe funcționale și probleme cauzate de acestea; primele trei forme normale.

2.1. Arhitectura unei baze de date

În prezent informația este o componentă esențială în desfășurarea oricărei activități. Informația trebuie să influențeze procesul de luare a deciziilor; acestea trebuie să fie mai bune decât cele care s-ar lua în absența informației. De aceea aceasta trebuie să fie disponibilă în timp util, să fie corectă, coerentă, neredundantă. Cum satisfacem aceste cerințe în condițiile în care volumul datelor care trebuie prelucrate este în continuă creștere? Sunt deci necesare sisteme care să asigure culegerea, memorarea, organizarea, regăsirea și prelucrarea acestora. Aceste activități sunt posibile în prezent și în informatică ele sunt legate nemijlocit de noțiunea de baze de date.

2.1.1. Avantajele bazelor de date

O bază de date este o colecție de date persistente utilizate de sistemul de aplicații al unei instituții. Colecția de date este concretizată printr-un ansamblu de fișiere pe disc care au o anumită stabilitate în timp, deci care nu sunt date de intrare, de ieșire sau de manevră. Un sistem de gestiune a bazelor de date (în engleză DBMS: DataBase Management System) este un pachet unitar de programe care oferă facilități de descriere a datelor și de prelucrare a acestora.

Aplicațiile de baze de date se caracterizează în primul rând prin faptul că majoritatea prelucrărilor care se fac sunt cele de memorare și regăsire a datelor, efectuate asupra unor volume mari de date. În general operațiile de prelucrare sunt destul de simple, spre deosebire de alte domenii ale informaticii – cum este de exemplu domeniul tehnic, unde predomină operațiile de calcul care au o complexitate destul de ridicată. Cea mai frecventă operație care apare într-o aplicație de baze de date este aceea de consultare a datelor: într-adevăr, pentru ce creăm o bază de date dacă nu o folosim? Alte operații care apar pe lângă cea de consultare: introducerea unor noi date, modificarea unor date existente, ștergerea unor date perimate.

Prin organizarea datelor în baze de date se asigură centralizarea acestora, fapt care conduce la o serie de avantaje.

1) Reducerea redundanței datelor. Dacă fiecare aplicație lucrează cu fișiere proprii este posibil ca aceleași date să apară de mai multe ori în fișiere diferite. În cazul centralizării datelor administratorul bazei de date poate organiza datele în așa fel încât toate aplicațiile să folosească aceleași fișiere. Astfel se obține o economie importantă a spațiului de memorie, și nu numai atât.

2) Evitarea inconsistenței datelor. Duplicarea datelor în fișiere diferite poate crea probleme la actualizare: este posibil ca prin actualizări parțiale (din omisiune sau datorită unor accidente neprevăzute) să avem valori diferite pentru una și aceeași entitate (de exemplu, un client poate avea mai multe nume: nu mai știm care este cel real).

3) Posibilitatea partajării datelor. Aceasta se referă la posibilitatea utilizării datelor în comun de mai mulți utilizatori și la posibilitatea dezvoltării de noi aplicații folosind datele deja existente.

4) Încurajarea utilizării unor standarde. Administratorul bazei de date poate impune alinierea la anumite standarde, fapt care permite ulterior un transfer rapid al datelor de pe o platformă (hardware sau software) pe alta.

5) Posibilitatea protejării datelor. Administratorul bazei de date, având un control centralizat al datelor, poate introduce restricții diferite de acces la date pentru fiecare categorie de utilizatori.

6) Menținerea integrității datelor. Baza de date trebuie să conțină în permanență date corecte; aceasta presupune date coerente și plauzibile, fapt care poate fi garantat de procedurile de validare utilizate.

7) Independența datelor. Într-o aplicație scrisă într-un limbaj clasic de programare, cunoștințele despre structura datelor și tehnicile de accesare a acestora sunt „zidite” în programe. Orice schimbare în modul de reprezentare sau accesare face imposibilă utilizarea aplicației: toate programele care referă aceste date trebuie rescrise. Independența datelor, garantată de utilizarea bazelor de date, presupune independența aplicației de modul de reprezentare a datelor și de tehnicile de acces utilizate.

Trebuie să facem o precizare: simplul fapt de a utiliza un SGBD în vogă la un moment dat nu ne garantează automat obținerea acestor avantaje! Administratorul bazei de date trebuie să aibă o viziune de ansamblu asupra problemei care trebuie rezolvată, să cunoască toate datele problemei (ce se dă, ce se cere, cum se prelucrează) și să cunoască facilitățile oferite de SGBD-ul folosit pentru a putea beneficia de avantajele de mai sus. Și în primul rând trebuie să aibă cunoștințe serioase despre proiectarea aplicațiilor de baze de date.

2.1.2. Arhitectura unei baze de date

Să luăm un exemplu simplificat din practică: evidența facturilor într-un magazin. Atunci când un client dorește să cumpere niște produse, se întocmește o factură după modelul celei din figura 1. Ceea ce am prezentat în figura respectivă este un model extern al bazei de date, care descrie modul în care vede vânzătorul datele acesteia. Dacă pe șeful magazinului îl interesează care produse se vând cel mai bine într-o anumită perioadă de timp, atunci el poate primi o situație după modelul din figura 2.

Figura 2.1. Un model extern pentru vânzător

Figura 2.2. Un model extern pentru șeful magazinului

Modelul extern este cel mai apropiat de utilizator și cuprinde descrierea structurii logice a datelor referitoare la aplicațiile fiecărui utilizator. Observăm că fiecare utilizator vede altfel baza de date, deși ea este unică și este memorată într-un mod care este ascuns tuturor.

Modelul conceptual cuprinde descrierea structurii datelor și a legăturilor dintre acestea pentru întreaga bază de date. În figura 3 este prezentat modelul conceptual al bazei de date pentru problema evidenței facturilor. Baza de date se compune din patru tabele (Clienti, Produse, Facturi, Detalii) și pentru fiecare tabelă este prezentată structura acesteia, cu alte cuvinte câmpurile care o descriu. Am marcat cu (*) acele cîmpuri cheie care servesc la identificarea unică a fiecărei înregistrări din tabelă. Astfel, pentru tabela Clienti cheia primară este Codc, pentru Produse: Codp, pentru Facturi: Nrf; pentru tabela Detalii ea este formată din două cîmpuri: Nrf și Codp. Legăturile dintre tabelele componente se văd ușor deoarece am folosit aceleași nume pentru câmpurile care asigură aceste legături.

Figura 2.3. Modelul conceptual al bazei de date

Modelul conceptual este independent de modul de memorare a datelor, fapt care garantează independența datelor. Să remarcăm faptul că în figura 3 nu am precizat tipul câmpurilor pentru nici o tabelă.

Modelul intern definește modul de memorare a datelor și tehnicile de accesare a acestora. La acest nivel se definește pentru fiecare câmp modul de reprezentare internă (dacă este șir de caractere, întreg binar, zecimal extern, boolean etc). Baza de date apare ca o colecție de fișiere avînd diferite moduri de organizare (liste înlănțuite, tabele de dispersie, arbori etc), aceste fișiere conținând datele ce formează baza de date. Acest nivel este cel mai apropiat de sistemul de operare. Scopurile urmărite în alegerea modelului intern sunt minimizarea spațiului utilizat și a timpilor de acces la date.

În figura 4 este prezentată o vedere de ansamblu a arhitecturii unei baze de date. De ce este oare necesară o arhitectură atît de complexă? Drumul pe care l-a parcurs activitatea de prelucrare a volumelor mari de date a fost destul de lung și de sinuos. S-a urmărit o simplificare pe două planuri: pe de o parte accesul utilizatorului la date, pe de altă parte proiectarea aplicațiilor.

Figura 2.4. Arhitectura unei baze de date

Cum rezolvă SGBD-ul o cerere de acces pe care o face un utilizator?

SGBD-ul interpretează această cerere în conformitate cu modelul extern al utilizatorului respectiv și găsește corespondența dintre modelul extern al acestuia și modelul conceptual. În continuare determină componentele modelului conceptual care vor interveni în rezolvarea cererii și face un acces la acestea pe baza corespondenței dintre modelul conceptual și modelul intern. După ce au fost identificate toate datele necesare, se revine din nou la modelul extern, acestea sunt integrate și prezentate în final utilizatorului.

Trebuie să precizăm faptul că în practică modelul prezentat mai sus nu este întotdeauna respectat intregral. Multe SGBD-uri nu fac o distincție netă între modelul conceptual și cel intern. Scopul pe care l-am urmărit în expunerea de față este de a pune în evidență acea parte a bazei de date care prin stabilitatea ei garantează independența aplicațiilor față de structura datelor și coerența informațiilor memorate în baza de date.

Vom vedea în continuare (prezentarea limbajului SQL) că atunci cînd descriem o componentă a unei baze de date precizăm pentru fiecare câmp și tipul acestuia. Acest lucru este firesc deoarece atunci când proiectăm o bază de date avem în vedere și operațiile de prelucrare care se vor face. Dacă avem de efectuat operații aritmetice (adunări, scăderi, înmulțiri etc) atunci operanzii trebuie să fie neapărat de tip numeric, ei nu pot fi șiruri de caractere!

Modelul conceptual este inima oricărei baze de date și de aceea proiectarea acestuia este deosebit de importantă, deoarece de felul în care este rezolvată această problemă depinde soarta aplicațiilor care vor exploata baza de date. Dacă acesta este atent proiectat atunci aplicațiile vor fi proiectate relativ ușor și vor avea o fiabilitate garantată. În caz contrar vor apărea mereu probleme pentru rezolvarea cărora va trebui să apelăm de multe ori la improvizații.

2.1.3. Administratorul bazei de date

Acesta este o persoană sau un grup de persoane care răspunde de ansamblul activităților legate de baza de date. Problemele pe care le rezolvă sunt următoarele:

1) Decide care informații vor fi stocate în baza de date. Pe baza informațiilor pe care le primește de la viitorii beneficiari (utilizatori) ai bazei de date identifică care entități prezintă interes pentru buna desfășurare a activităților instituției, și care informații ce caracterizează aceste entități trebuie memorate. În acest moment el este în măsură să proiecteze schema conceptuală.

2) Decide structura datelor care vor fi memorate și tehnicile de accesare. Administratorul bazei de date trebuie să urmărească stabilirea unui raport optim spațiu de memorare / timpi de acces. Modelul intern este proiectat avându-se în vedere o estimare a evoluției volumului datelor, frecvența accesării lor, implicațiile acestora în prelucrări.

3) Proiectează modelele externe pentru fiecare categorie de utilizatori. Administratorul bazei de date se informează în legătură cu cerințele acestora și eventual balansează cerințele conflictuale. Aceasta se face printr-o alegere atentă a modelului intern.

4) Definește strategia de garantare a integrității datelor. Există posibilitatea ca baza de date să nu mai fie operațională la un moment dat, fie din cauza unor erori în operare, fie din cauza unor pene hard, fie din alte cauze neprevăzute. Este foarte important pentru instituție ca baza de date să fie refăcută într-un timp cât mai scurt și cu pierderi minime de informații. Pentru aceasta administratorul bazei de date elaborează strategii de salvare periodică a bazei de date și de refacere a acesteia (parțială sau în întregime) pe baza unor copii de siguranță.

5) Monitorizează performanțele sistemului. Pentru a obține o creștere a eficienței aplicațiilor urmărește modul de utilizare a resurselor și depistează factorii care limitează performanțele sistemului. În sfârșit el determină o planificare a funcționării sistemului pentru a maximiza performanțele acestuia.

Un set minimal de unelte pe care le folosește administratorul bazei de date în munca sa sunt:

– rutine de inițializare (pentru încărcarea inițială a bazei de date);

– rutine de import și export a datelor în și respectiv din baza de date (conversii);

– rutine de jurnalizare și restaurare;

– rutine de control și refacere a coerenței;

– rutine de analiză statistică a funcționării sistemului.

2.2. Modelul relațional

Ce este modelul relațional? O caracterizare ar putea fi următoarea: modelul relațional este o tehnică de descriere a datelor cu ajutorul tabelelor, și o tehnică de manipulare a acestora cu ajutorul unor operatori specifici calculului relațional și / sau algebrei relaționale, concretizați prin utilizarea unor limbaje specifice – cum ar fi QbE (Query by Example) sau SQL (Structured Query Language). Modelul relațional este un model abstract care are la bază fundamente matematice solide (teoria algebrică a relațiilor). Principiile modelului relațional au fost descrise prin 1969–1970 de către E F Codd, cercetător la IBM. El a fost primul care a înțeles că rigoarea matematică poate fi folosită pentru a introduce principii solide în domeniul gestiunii bazelor de date – domeniu care era foarte deficitar la acest capitol.

2.2.1. Modelul entitate-asociere

În nota precedentă am prezentat o arhitectură clasică a unei baze de date. Aceasta este organizată pe trei nivele: nivelul extern sau utilizator, nivelul conceptual și nivelul intern. Pentru a descrie nivelul conceptual folosim un model abstract numit model entitate-asociere.

Elementul fundamental al acestui model este noțiunea de entitate: acest termen generic desemnează un obiect care face parte dintr-o clasă (mulțime) de entități, toate aceste obiecte fiind similare ca structură, dar care pot fi deosebite prin proprietăți specifice (pe care le vom numi în continuare atribute). Deoarece definiția este destul de vagă (imprecisă) vom da două exemple preluate dintr-o problemă (simplificată) de evidență a facturilor, și dintr-o altă problemă de evidență a personalului:

– mulțimea clienților unui magazin formează o clasă de entități; toți acești clienți au niște atribute: cod personal, nume, localitate (de domiciliu), adresa; fiecare client este o entitate identificabilă prin codul personal al acestuia;

– mulțimea produselor aflate în evidența magazinului formează o altă clasă de entități; toate aceste produse pot fi caracterizate prin: cod produs, denumire, preț unitar; fiecare produs este o entitate identificabilă prin codul acestuia;

– mulțimea departamentelor unei firme; orice departament se caracterizează prin: cod, denumire, șef;

– mulțimea angajaților unei firme: fiecare angajat se caracterizează prin: număr legitimație, nume, departamentul la care lucrează.

Un alt element care caracterizează acest model este noțiunea de legătură. Această legătură (asociere) între mai multe clase de entități E1, …, En (nu neapărat distincte) presupune existența unei mulțimi de valori (e1, …, en), unde ei este mulțimea valorilor atributelor unei entități din clasa Ei. În practică de cele mai multe ori întîlnim legături între două clase de entități (n2); acestea se numesc legături binare.

Un exemplu concret preluat din evidența personalului:

(101, "Salarii", 5001, 5001, "Petrescu", 101)

Primele trei valori sunt preluate din clasa de entități Departam, următoarele trei din Personal. Se observă ușor că această mulțime de valori este un element al produsului cartezian al celor două mulțimi: Departam și Personal. După ce eliminăm valorile care se repetă (această operație este numită proiecție) obținem:

(101, "Salarii", 5001, "Petrescu")

Să clasificăm în continuare legăturile binare după cardinalitatea acestora (câte entități din fiecare clasă intră în cadrul legăturii):

– legături de tip 1:1 (one-to-one); observăm o astfel de legătură în cazul unei evidențe a personalului, care indică faptul că un departament este condus de un șef (un departament nu poate fi condus de mai mulți șefi, un șef nu poate conduce mai multe departamente);

– legături de tip 1:n (one-to-many); în evidența personalului remarcăm o astfel de legătură între angajații unui departament și departamentul în cauză (la un departament lucrează mai mulți angajați, un angajat nu poate lucra în cadrul mai multor departamente); la evidența facturilor remarcăm o legătură între Facturi și Clienti (unui client i se pot întocmi mai multe facturi; nu se poate întocmi o aceeași factură pentru mai mulți clienți);

– legături de tip m:n (many-to-many); o astfel de legătură există între Clienti și Produse: un client poate cumpăra mai multe produse, și în același timp mai mulți clienți pot cumpăra un același sortiment de produse.

La sfârșitul acestei note sunt prezentate două modele entitate-asociere împreună cu exemple de baze de date corespunzătoare.

Primul model entitate-asociere se referă la evidența personalului. Am pus în evidență cele două tipuri de legături existente între entitățile Departam și Personal.

Al doilea model se referă la evidența facturilor. Am pus în evidență, ca în exemplul de mai sus, pentru fiecare clasă de entități cheile primare și cheile externe.

După ce vor fi prezentate fundamentele modelului relațional, vom prezenta și tehnici de implementare a acestor tipuri de legături.

2.2.2. Domeniu, atribut, relație

Un domeniu este o mulțime de valori scalare (atomice, care nu pot fi descompuse) de același tip. Exemple: mulțimea codurilor personale, mulțimea numelor de clienți, mulțimea numelor de localități ș a. Cu aceste valori se pot efectua mai multe operații:

– cu majoritatea acestor valori se pot face comparații;

– cu unele valori se pot face și alte operații: o cantitate poate fi înmulțită cu un preț (rezultând o valoare), un preț poate fi înmulțit cu o valoare (de exemplu în cazul unei majorări) ș.a.m.d.

Un atribut al unei clase de entități este o caracteristică (proprietate) care ia valori într-un anumit domeniu. Exemple:

– atributele clasei de entități Clienti sunt: cod client, nume client, localitate, adresa;

– atributele clasei de entități Produse sunt: cod produs, denumire produs, preț unitar.

O relație (în sens algebric) este o submulțime a unui produs cartezian D1 D2 … Dn, unde Di sunt domenii de valori (nu neapărat distincte). Aceasta a fost definiția folosită mult timp și pentru noțiunea de relație în domeniul bazelor de date – modelul relațional. Unul dintre cei mai prestigioși autori de lucrări în acest domeniu, C J Date, propune o nouă definiție pentru noțiunea de relație (în domeniul bazelor de date): aceasta se compune din două părți:

– antetul relației, care este o mulțime de atribute definite fiecare pe câte un domeniu de valori (aceste domenii nu sînt neapărat distincte):

{A1:D1, A2:D2, …, Am:Dm};

– corpul relației, care este o mulțime de tuple (un tuplu este o generalizare a noțiunii de cuplu); fiecare tuplu este definit ca o mulțimi de valori ale atributelor definite în cadrul antetului:

{{A1:v11, A2:v12, …, Am:v1m}, …, {A1:vn1, A2:vn2, …, Am:vnm}}.

Valoarea m (numărul de atribute ale relației) reprezintă gradul relației, și valoarea n (numărul de tuple) reprezintă cardinalitatea relației.

Din definiția de mai sus a noțiunii de relație rezultă următoarele proprietăți:

– atributele nu sunt ordonate (ordinea lor nu este semnificativă) – rezultă din faptul că antetul este definit ca o mulțime de atribute (într-o mulțime ordinea elementelor nu este semnificativă);

– atributele sunt distincte (chiar dacă pot exista două atribute definite pe același domeniu) – elementele unei mulțimi sunt distincte;

– în cadrul corpului relației tuplele nu sunt ordonate – corpul relației este definit ca o mulțime de tuple;

– orice atribut are doar valori atomice; această proprietate poate fi enunțată și astfel: la intersecția dintre o linie și o coloană se află întotdeauna o singură valoare, și niciodată o colecție de valori; rezultă că o relație nu conține grupuri repetitive; spunem în acest caz că relația se află în prima formă normală;

– nu există tuple duplicate (deoarece corpul unei relații este o mulțime de tuple).

Dacă o linie din tabela Clienti conține valorile:

(80001,"Ionescu","Bucuresti","Str Libertatii")

toate aceste valori se află într-o anumită relație: ele definesc identitatea unui client, care are cod personal 80001, are numele "Ionescu", domiciliază în localitatea "Bucuresti" la adresa "Str Libertatii".

Prezentăm în continuare o corespondență între termenii formali (definiți mai sus) și termenii informali (folosiți în mod curent în exploatarea bazelor de date relaționale):

Relație Tabelă

Tuplu Linie, înregistrare

Cardinalitate Număr de linii

Atribut Coloană, câmp

Grad Număr de coloane

Domeniu Mulțime de valori valide

Corespondența nu trebuie considerată ca o echivalență, deoarece există câteva deosebiri de care trebuie să ținem seama (este de altfel una dintre diferențele pe care le sesizăm între teorie și practică):

– noțiunea de relație este o noțiune teoretică, pe când o tabelă este un obiect concret, care are o anumită reprezentare în calculator – de exemplu sub forma unui tablou unidimensional de înregistrări (structuri);

– într-o relație ordinea atributelor și a tuplelor nu este semnificativă; într-o tabelă există o ordonare atât a coloanelor – dată de ordinea acestora la crearea tabelei, cât și a liniilor – dată de ordinea în care acestea au fost introduse, sau de ordinea unei chei care induce o anumită ordonare a liniilor în cadrul tabelei;

– o relație este formată întotdeauna din tuple distincte; în multe cazuri o tabelă poate avea linii duplicate, dacă pentru aceasta nu a fost definită o cheie primară.

2.2.3. Cheie primară, cheie externă

O cheie candidată a unei relații R este o mulțime K de atribute cu următoarele proprietăți:

– identificare unică: nu există două tuple distincte în R care să aibă aceeași valoare pentru setul de atribute K; cu alte cuvinte, mulțimea K de atribute identifică în mod unic fiecare tuplu al relației R;

– nereductibilitate: nu există o submulțime proprie a lui K (distinctă de K) care să aibă proprietatea de identificare unică.

O cheie este simplă dacă este formată dintr-un singur atribut, și este compusă în caz contrar.

O relație poate avea mai multe chei candidate; una dintre acestea se alege pentru a fi folosită în aplicații ca și cheie de identificare a tuplelor. Cheia candidată folosită în acest scop se numește cheie primară; de obicei se folosesc în acest scop acele chei care reprezintă coduri ale înregistrărilor memorate în baza de date. Un motiv important pentru a justifica o astfel de alegere este următorul: valorile de tip cod ocupă foarte puțin spațiu în comparație cu informațiile pe care le identifică, fapt care conduce la o economie importantă de spațiu în cazul creării unui index, precum și la accelerarea regăsirii informațiilor în cazul în care se fac corelații între tabele.

Să analizăm unul din exemplele prezentate:

– tabela Clienti are cheia primară Codc, tabela Produse are cheia primară Codp, tabela Facturi are cheia primară Nrf; în toate aceste cazuri se verifică ușor cele două proprietăți ale cheii primare – atât identificarea unică cât și ireductibilitatea sunt evidente;

– tabela Detalii are cheia primară compusă din atributele Nrf și Codp; ireductibilitatea este evidentă și în acest caz, deoarece este posibil să avem mai multe linii cu aceeași valoare pentru Nrf (când un client cumpără mai multe produse cu aceeași factură), și de asemenea este posibil să avem mai multe linii cu aceeași valoare pentru Codp (când mai mulți clienți cumpără același tip de marfă).

În continuare se definește noțiunea de cheie externă (sau cheie străină) în conexiune cu noțiunea de cheie candidată. Să facem precizarea că în majoritatea situațiilor practice apar legături între tabele care se materializează prin coincidența valorilor cheilor primare și externe.

Fie R2 o relație. O cheie externă din R2 este o mulțime Ek de atribute cu următoarele proprietăți:

– există o tabelă R1 (care poate să coincidă sau nu cu R2) care are o cheie candidată Pk;

– fiecare valoare a setului Ek din R2 coincide cu o valoare a setului Pk din R1.

Să analizăm din nou unul din exemplele prezentate:

– tabela Facturi are o cheie externă Codc, care este cheie primară în tabela Clienti;

– tabela Detalii are două chei externe: Nrf care este cheie primară în tabela Facturi, și Codp care este cheie primară în tabela Produse; am remarcat mai sus că cele două chei externe formează împreună cheia primară a tabelei Detalii.

Să facem câteva precizări:

– prin definiție, fiecare valoare a unei chei externe trebuie să se regăsească printre mulțimea valorilor cheii candidate corespondente; reciproca nu este obligatorie: de exemplu, putem să înregistrăm informații în tabela Clienti despre un potențial client, chiar dacă acesta încă nu cumpără nimic; putem de asemenea să înregistrăm informații despre un produs pe care îl aducem în magazin, și care încă nu este cumpărat de nici un client;

– o cheie externă este simplă dacă și numai dacă cheia candidată corespondentă este simplă, și este compusă dacă și numai dacă cheia candidată corespondentă este compusă;

– fiecare atribut component al unei chei externe trebuie să fie definit pe același domeniu al componentei corespondente din cheia candidată;

– o valoare a unei chei externe reprezintă o referință către un tuplu care conține aceeași valoare pentru cheia candidată corespondentă; se pune astfel problema integrității referinței: o bază de date nu trebuie să conțină valori invalide pentru chei externe, altfel spus dacă B referă pe A atunci A trebuie să existe.

Ce se întâmplă dacă ștergem din tabela Clienti un client pentru care avem câteva linii în tabela Facturi? Dacă operația de ștergere se efectuează fără nici un control, după ștergere nu mai este respectată regula integrității referinței. Pentru a preveni asemenea situații, în tabela Facturi precizăm la creare:

[on delete option] [on update option]

unde option poate fi:

– restricted dacă dorim ca operația cerută pentru tabela Clienti să fie respinsă;

– cascades dacă dorim ca operația cerută pentru tabela Clienti să provoace operații (actualizări sau ștergeri) „în cascadă” – se actualizează (sau se șterg) toate liniile afectate din tabela Facturi; în acest al doilea caz se cere o atenție deosebită, deoarece o ștergere a unei linii din tabela Facturi poate afecta linii din tabela Detalii.

Cheile externe se folosesc pentru a implementa legăturile dintre entități. Legăturile de tip one-to-one și one-to-many se implementează introducând în una din tabele o cheie externă, care va face legătura cu cheia primară din tabela corespondentă. O legătură de tip many-to-many se implementează introducând o tabelă suplimentară care are o cheie primară compusă, fiecare element al cheii primare fiind o cheie externă. Exemplul de mai sus este (sperăm) concludent în acest sens.

2.2.4. Valori NULL

Există unele situații când regula integrității referinței nu poate fi respectată. Să considerăm următorul exemplu foarte simplu: o bază de date pentru evidența personalului compusă din două tabele:

Departam (Codd, Dend, Sef)

Personal (Nrl, Nume, Dep)

Observăm că tabela Departam are ca și cheie primară atributul Codd, și cheie externă Sef, care este cheie primară în tabela Personal. De asemenea tabela Personal are ca și cheie primară atributul Nrl, și cheie externă Dep, care este cheie primară în tabela Departam. În momentul creării celor două tabele nu există nici o informație înregistrată. Dacă dorim să introducem informații despre un departament operația de inserare va fi respinsă deoarece nu avem informațiile despre șeful departamentului respectiv. Dacă dorim să introducem informații despre șeful unui departament operația de inserare va fi de asemenea respinsă deoarece nu avem informațiile despre departamentul respectiv.

Această problemă este rezolvată prin introducerea noțiunii de valoare NULL; semnificația acestei valori este valoare necunoscută sau informație absentă. În concordanță cu această nouă noțiune regulile de integritate se completează astfel:

– integritatea entității: orice atribut al unei chei primare nu poate avea valoarea NULL;

– integritatea referinței: orice valoare a unei chei externe este fie NULL fie coincide cu o valoare a unei chei candidate corespondente.

Problema enunțată mai sus se poate rezolva în felul următor:

– mai întâi se introduc informațiile despre departament, dar fără să se precizeze informația despre șeful departamentului;

– în continuare se introduc informațiile despre șeful departamentului, și în acest moment se poate introduce și informația despre departamentul la care acesta lucrează;

– în final se actualizează informația absentă din tabela Departam.

2.2.5. Crearea unei baze de date relaționale în SQL

O bază de date relațională este o bază de date care este văzută de utilizator ca o colecție de relații (tabele) normalizate (aduse cel puțin în forma întâi normală).

La sfîrșitul acestei note de curs sunt prezentate două exemple de baze de date. Prima se referă la evidența personalului, iar cea de a doua la evidența facturilor.

Înainte de a prezenta instrucțiunile SQL pentru definirea unei baze de date să facem câteva precizări. Numele limbajului (prescurtare de la Structured Query Language – limbaj structurat de interogare) este impropriu după cum se poate ușor observa. Acest limbaj ne permite atât definirea datelor, cât și manipularea acestora: inserare, modificare, ștergere, consultare (interogare). Orice operație realizată de o instrucțiune SQL operează cu tabele SQL. O tabelă SQL, spre deosebire de relații, poate avea linii duplicate. De asemenea tabelele SQL au o ordine precizată a coloanelor (de la stânga la dreapta), în schimb ordinea liniilor nu este semnificativă.

O tabelă SQL se creează cu ajutorul unei comenzi Create table:

Create table Nume-tabela (Coloana Reprezentare

[Valoare-implicită] [Restricții], …);

Reprezentare. Standardul SQL precizează mai multe tipuri de date scalare (detalii privind modul de reprezentare trebuie căutate în documentația SGBD-ului care se folosește în mod concret), unele dintre acestea fiind prezentate în continuare:

Char(n) – o coloană de șiruri de maximum n caractere;

Integer – o coloană de valori întregi pozitive sau negative (de regulă întregi pe 4 octeți);

Smallint – o coloană de valori întregi mici (de regulă întregi pe 2 octeți);

Float(p) – o coloană de valori reprezentate în virgulă mobilă;

Decimal(p,q) – o coloană de valori zecimale, unde p este numărul total de poziții pe care se reprezintă numărul, și q este numărul de cifre ale părții zecimale (punctul zecimal nu se reprezintă în mod explicit)

Date – o coloană de valori de tip dată calendaristică, pentru reprezentarea cărora se folosește un format specific SGBD-ului folosit;

Time – o coloană de valori de tip oră exactă.

Valoare implicită. Pentru fiecare coloană se poate preciza o valoare implicită (care trebuie să se încadreze în tipul de date definit la reprezentare), în cazul în care la inserarea unei linii în tabelă nu este precizată o valoare pentru coloana respectivă. Dacă nu a fost precizată o valoare implicită la creare și nici la inserare, atunci coloana respectivă va primi o valoare NULL, dar numai dacă o valoare NULL este permisă. O valoare implicită se precizează astfel:

default = valoare

Restricții. O restricție poate fi de tipul următor:

not NULL – coloana respectivă nu poate primi valori NULL;

check(condiție) – se precizează o condiție care va fi verificată în momentul inserării unei linii în tabelă, sau în momentul actualizării unei linii:

check(Pretu > 0)

– restricție de tip cheie candidată:

unique(lista-coloane)

– restricție de tip cheie primară:

primary key (lista-coloane)

– restricție de tip cheie externă:

foreign key (lista-coloane) references

Nume-tabela [on delete option]

[on update option]

Comenzile SQL pentru crearea bazei de date cu care am lucrat până acum pot fi următoarele:

Create table Clienti (Codc Integer,

Nume Char(60), Localit Char(60),

Adresa Char(60), primary key Codcl);

Create table Produse (Codp Integer,

Den Char(60), Pretu Integer,

primary key Codp, check (Pretu > 0));

Create table Facturi (Nrf Integer, Dataf Date,

Codc Integer, primary key Nrf,

foreign key Codc references Clienti

on delete restricted

on update restricted);

Create table Detalii (Nrf Integer,

Codp Integer, Cant Integer,

primary key (Nrf, Codp),

foreign key Nrf references Facturi,

foreign key Codp references Produse

on delete restricted

on update restricted);

Structura unei tabele poate fi modificată ulterior cu ajutorul unei comenzi Alter table:

Alter table Nume-tabela add / modify / drop

Nume-coloană Specificații …

Este posibil să adăugăm o coloană nouă în tabelă, să ștergem o coloană existentă din tabelă, sau să modificăm specificațiile (de tip, de restricții etc) ale unei coloane existente.

2.2.6. Încărcarea și actualizarea datelor

Introducerea datelor. Instrucțiunea Insert are sintaxa următoare:

Insert into Nume-tabela [(lista-coloane)]

values (lista-valori);

Datele pot fi introduse în mai multe moduri:

– se precizează lista coloanelor care vor primi valori, și în acest caz celelalte coloane vor primi fie valoarea NULL fie valoarea implicită specificată la crearea tabelei; lista valorilor corespunde cu lista coloanelor; exemplu:

Insert into Departam (Codd, Dend)

values (101, 'Salarii');

– nu se precizează lista coloanelor, caz în care trebuie specificate valorile în listă în conformitate cu lista coloanelor precizată la crearea tabelei; lista valorilor trebuie să fie completă (eventual cu argumente absente precizate explicit); exemplu:

Insert into Departam

values (101, 'Salarii',);

Insert into Personal

values (5001, 'Petrescu',101);

Actualizarea datelor. Instrucțiunea Update are sintaxa următoare:

Update Nume-tabela set coloana = valoare

[where condiție];

Sunt actualizate liniile din tabelă pentru care este verificată condiția specificată. Atenție: dacă nu s-a specificat nici o condiție sunt actualizate toate liniile tabelei. Exemplu:

Update Departam set Sef = 10

where Codd = 100;

Ștergerea datelor. Instrucțiunea Delete are sintaxa următoare:

Delete from Nume-tabela [where condiție];

Sunt șterse liniile din tabelă pentru care este verificată condiția specificată. Atenție: dacă nu s-a specificat nici o condiție sunt șterse toate liniile tabelei.

Exemplu:

Delete from Departam

where Departament = 'Salarii';

Model entitate-asociere pentru evidența personalului

Un exemplu de bază de date pentru evidența personalului

Departam Personal

Codd Dend Sef Nrl Nume Dep

100 Conducere 5000 Popescu 100

101 Salarii 5001 Petrescu 101

102 Productie 5002 Ionescu 102

5005 Carme 100

5006 Adam 102

5007 Elena 101

5008 Barbu 102

5009 Eugen 102

Un model entitate-asociere pentru evidența facturilor

Un exemplu de bază de date pentru evidența facturilor

Clienti

Codc Nume Localit Adresa

8001 Ionescu Brasov Str Libertatii

8002 Vasilescu Cluj Aleea Carpati

8003 Moldovan Iasi Str Rozelor

Produse

Codp Denp Pretu

90001 Radio 1500

90002 Casetofon 2500

90003 Televizor 3600

90004 Mixer 1200

90005 Picup 900

Facturi

Detalii

Nrf Dataf Codc Nrf Codp Cant

0001 12.01.2002 8001 0001 90001 2

0002 15.02.2002 8002 0001 90002 1

0003 25.02.2002 8001 0002 90001 1

0004 07.03.2002 8003 0002 90002 2

0002 90003 1

0003 90003 1

0004 90002 1

0004 90004 1

2.3. Instrucțiunea Select SQL

În nota de curs precedentă am făcut cunoștință cu câteva instrucțiuni ale limbajului SQL: Create table, Insert, Update, Delete. Aceste instrucțiuni ne-au permis să creăm tabele, să introducem și să actualizăm informații în aceste tabele. În articolul de față prezentăm câteva posibilități de interogare a bazelor de date relaționale cu ajutorul instrucțiunii Select SQL. Deoarece aproape fiecare SGBD relațional implementează un subset al limbajului SQL, plus unele „inovații” care creează uneori confuzii, insistăm doar asupra unor aspecte pe care le considerăm esențiale.

Limbajul SQL (Structured Query Language) a fost creat prin anii '70 în laboratoarele din San Jose ale firmei IBM. Sintaxa acestui limbaj este, după cum ne-am putut da seama, destul de apropiată de limba engleză, fiind adecvat programării pe calculator și ușor de asimilat de către utilizatori. SQL nu este un limbaj de programare (așa cum sunt limbajele procedurale cunoscute: C, Pascal, Fortran, Cobol), este destinat manipulării datelor dintr-o bază de date relațională. De aceea el este inclus într-un limbaj procedural cu care este dotat aproape fiecare SGBD relațional. Sintaxa generală a instrucțiunii Select SQL este următoarea:

Select [distinct] atribut / expresie …

from tabelă [as sinonim] …

[where condiții-selecție și / sau condiții-legătură …]

[group by atribut …]

[having condiții-selecție …]

[order by atribut asc / desc …];

Rezultatul selecției este o tabelă ale cărei coloane sunt câmpurile și / sau expresiile care apar în lista clauzei Select. Pentru a ilustra mai multe posibilități de utilizare a instrucțiunii Select SQL, vom lucra cu cinci exemple de baze de date. Numele tabelelor și ale cîmpurilor au fost alese în așa fel încît să sugereze cît mai bine semnificația lor, precum și să evidențieze cât mai clar legăturile dintre tabele. În nota de curs următoare aceste exemple vor fi reluate și explicate, astfel că în final vom înțelege de ce o bază de date trebuie să fie compusă din așa de multe tabele. Pentru început trebuie să știm că în felul acesta se garantează corectitudinea datelor introduse (sau cel puțin există un control din partea SGBD-ului), se elimină redundanțele (repetițiile inutile), și eventuale actualizări se pot face ușor fără a afecta integritatea informațiilor deja introduse.

2.3.1. Selectarea unor informații dintr-o tabelă

Exemplul 1 – o evidență simplificată a studenților:

StudNote (Stud, Disc, Nota)

Pentru a ilustra utilizarea instrucțiunii Select folosind o singură tabelă, vom face pentru început referire la tabela StudNote din primul exemplu care conține informații despre notele obținute de fiecare student la toate disciplinele pe care le studiază. Structura tabelei este foarte simplă, având doar trei coloane (Stud, Disc, Nota), primele două formând cheia primară.

Cel mai simplu exemplu de instrucțiune Select este următorul:

Select * from StudNote;

Această instrucțiune selectează toate informațiile din tabela StudNote. Caracterul '*' se referă la toate coloanele tabelei (sau tabelelor – în cazul general) din lista clauzei from.

Putem selecta o parte din coloanele tabelei, ca în exemplul de mai jos:

Select Disc from StudNote;

Această instrucțiune selectează lista disciplinelor care sunt studiate. Dacă o folosim în forma prezentată mai sus, vom observa că tabela rezultat va avea tot atâtea linii câte are și tabela StudNote, aceasta deoarece fiecare disciplină apare de mai multe ori (o dată pentru fiecare student).

Următorul exemplu arată cum se poate obține lista studenților, de data aceasta fără repetiții supărătoare:

Select distinct Stud from StudNote;

Putem cere selectarea unor linii care îndeplinesc anumite condiții, de exemplu lista notelor sub 5:

Select * from StudNote where Nota < 5;

În clauza where putem preciza condiții complexe de căutare, combinate cu operatorii logici and, or și not, ordinea de evaluare fiind cea cunoscută. Se pot folosi și paranteze pentru a controla ordinea de evaluare a condițiilor.

2.3.2. Funcții de agregare în interogări cu o singură tabelă

Dacă ne interesează care este cea mai mare și cea mai mică notă dintre cele care au fost date, formulăm următoarea interogare:

Select min(Nota), max(Nota) from StudNote;

Media generală se obține astfel:

Select avg(Nota) from StudNote;

Folosim funcția count pentru a afla numărul de înregistrări ale tabelei StudNote:

Select count(*) from StudNote;

Standardul SQL definește următoarele funcții de agregare:

– min: valoarea minimă de pe o anumită coloană;

– max: valoarea maximă de pe o anumită coloană;

– sum: suma valorilor de pe o anumită coloană;

– avg: media aritmetică a valorilor de pe o anumită coloană;

– count: numărul de înregistrări selectate.

Funcțiile sum și avg pot fi folosite doar pentru coloane care au valori numerice, spre deosebire de celelalte care pot opera cu orice tip de valori. Funcția avg poate returna o valoare de tip diferit de cel al atributului căruia i se aplică (de exemplu, media aritmetică a unor valori întregi poate fi o valoare cu zecimale). Sunt necesare câteva precizări în legătură cu aceste funcții. Implicit ele iau în considerare toate valorile aflate pe coloana specificată; dacă se dorește să fie prelucrate doar valorile distincte, atunci numele coloanei trebuie precedat de cuvîntul cheie distinct.

Și o precizare în legătură cu funcția count. Aceasta poate fi folosită pentru a număra toate înregistrările – forma count(*), sau pentru a număra valorile distincte ale unei anumite coloane. De exemplu, ne interesează câți studenți avem în evidență:

Select count(distinct Stud) from StudNote;

Să presupunem că ne interesează notele cele mai mari, dar și care sunt studenții care au primit acele note. Pentru aceasta trebuie să comparăm fiecare notă cu valoarea maximă, care poate fi obținută printr-o interogare. Deducem că trebuie să folosim interogări SQL imbricate:

Select * from StudNote where Nota =

(Select max(Nota) from StudNote);

Comparația este posibilă deoarece instrucțiunea Select interioară returnează o singură valoare.

Acestea au fost interogări relativ simple. Dacă dorim să știm care studenți sunt restanțieri, interogarea este de asemenea foarte simplă:

Select distinct Stud from StudNote

where Nota < 5;

Am folosit clauza distinct deoarece altfel studenții care au mai mult de o restanță apar de mai multe ori în listă.

Dacă în schimb dorim să știm care sunt studenții integraliști, interogarea ne va da serioase dureri de cap. Aceasta deoarece, spre deosebire de cazul precedent, aici trebuie să formulăm altfel condițiile de selecție. Prezentăm în continuare două formulări echivalente:

– toate notele obținute de un student sînt de cel puțin 5;

– nici o notă obținută de un student nu este sub 5.

Ar trebui ca pentru fiecare student să încercăm să selectăm numai înregistrările corespunzătoare acestuia și care au nota sub 5. Se rețin în rezultatul final numai acei studenți pentru care nu s-a selectat nici o înregistrare (rezultatul selecției este vid).

Într-un limbaj pseudocod această problemă se rezolvă astfel:

for i from 1 to n do begin

S ;

for j from 1 to n

if (StudNote[i].Stud StudNote[j].Stud

and StudNote[j].Nota 5) then

S S StudNote[j];

if (S ) then

output(StudNote[i].Stud);

end

În secvența de mai sus am comparat cîmpul Stud din înregistrările StudNote[i] și StudNote[j]. În limbajul SQL nu avem o astfel de posibilitate; putem în schimb să folosim o tabelă sub mai multe nume (sinonime), și să comparăm două câmpuri ca și cum ele ar face parte din tabele diferite. Interogarea se rezolvă astfel:

Select Stud from StudNote as S

where not exists

(Select * from StudNote as T

where S.Stud = T.Stud and T.Nota<5);

Remarcăm folosirea expresiei condiționale not exists, care returnează valoarea true dacă tabela transmisă ca argument este vidă.

Să reformulăm interogarea cu scopul de a obține o instrucțiune Select mai scurtă: să se selecteze toți studenții care nu se află în lista restanțierilor. Această interogare se scrie astfel:

Select Stud from StudNote where not Stud in

(Select Stud from StudNote where Nota < 5);

Remarcăm folosirea expresiei condiționale not Stud in (…), care verifică dacă o valoare se află sau nu într-o listă (obținută pe baza unei selecții).

Până acum funcțiile de agregare au operat asupra tuturor valorilor din rezultatul selecției. Putem să construim și grupe de înregistrări asupra cărora să opereze aceste funcții. Ne interesează media fiecărui student:

Select Stud, avg(Nota) from StudNote

group by Stud;

Putem ordona această situație descrescător după medie și alfabetic după nume:

Select Stud, avg(Nota) from StudNote

group by Stud order by 2 desc, 1;

Dacă dorim să selectăm doar acei studenți care au media minimum 9, folosim și clauza having:

Select Stud, avg(Nota) from StudNote

group by Stud having avg(Nota) >= 9;

2.3.3. Selectarea unor informații din mai multe tabele

Exemplul 2 – evidența angajaților unei instituții:

Departam (Codd, Dend, Sef)

Personal (Nrl, Nume, Dep)

Ne interesează să aflăm, pentru fiecare departament, cine este șeful acestuia și câți angajați lucrează la departamentul respectiv:

Select Codd, Dend, Sef, Nume,

(Select count(*) from Angajati

where Codd = Dep)

from Departam, Angajati where Sef = Nrl;

Remarcăm și în acest caz folosirea unei instrucțiuni Select care returnează o valoare. Pentru această instrucțiune Select atributul Codd joacă același rol pe care îl are o variabilă globală într-un program C sau Pascal. Aceasta deoarece ne interesează câți angajați are un anumit departament: dacă am fi inclus în lista clauzei from și tabela Departam, atunci instrucțiunea Select interioară ar fi pierdut valoarea atributului Codd din exterior (să ne gândim ce se întâmplă atunci cînd scriem un program în C sau Pascal). Dar lucrurile nu s-ar opri aici: instrucțiunea Select interioară ar efectua produsul cartezian al celor două tabele și ar număra câte înregistrări ale acestui produs îndeplinesc condiția din clauza where.

În instrucțiunea Select exterioară remarcăm în clauza where o condiție care se numește condiție de legătură. Aceste condiții de legătură se scriu în general astfel:

cheie-primară cheie-externă

Exemplul 3 – evidența facturilor:

Clienti (Codc, Nume, Localit, Adresa)

Produse (Codp, Denp, Pretu)

Facturi (Nrf, Dataf, Codc)

Detalii (Nrf, Codp, Cant)

Dorim să știm care este valoarea fiecărei facturi:

Select Facturi.Nrf, Dataf, Facturi.Codc, Nume,

Localit, Adresa, Sum(Cant*Pretu)

from Facturi, Clienti, Detalii, Produse

where Facturi.Nrf = Detalii.Nrf

and Facturi.Codc = Clienti.Codc

and Detalii.Codp = Produse.Codp

group by Facturi.Nrf, Dataf, Facturi.Codc,

Nume, Localit, Adresa;

Remarcăm mai întâi necesitatea de a califica acele atribute care apar cu același nume în mai multe tabele. În al doilea rând (un fapt nu tocmai plăcut), necesitatea de a include în lista clauzei group by toate câmpurile din clauza Select care nu sunt funcții de agregare. Standardul SQL cere acest lucru, și majoritatea SGBD-urilor care implementează limbajul Select SQL se conformează acestei cerințe. În al treilea rând observăm că în lista clauzei Select putem avea și expresii aritmetice, chiar și ca argumente ale unei funcții de agregare.

O altă interogare pe care o putem face este: suma totală pe care a plătit-o fiecare client. Aceasta este ceva mai scurtă decât precedenta:

Select Facturi.Codc, Nume, Localit, Adresa,

Sum(Cant*Pretu)

from Facturi, Clienti, Detalii, Produse

where Facturi.Nrf = Detalii.Nrf

and Facturi.Codc = Clienti.Codc

and Detalii.Codp = Produse.Codp

group by Facturi.Codc, Nume, Localit,

Adresa;

Dacă dorim să aflăm căror clienți le-am întocmit facturi care totalizează o valoare maximă, trebuie să procedăm în doi pași. Mai întâi creăm o tabelă nouă în care depunem rezultatele selecției de mai sus. Pentru aceasta folosim instrucțiunea Insert cu următoarea sintaxă, presupunînd că avem creată o tabelă cu următoarea structură:

Valori (Codf, Nume, Localit, Adresa, Val)

Insert into Valori

Select Facturi.Codc, Nume, Localit, Adresa,

Sum(Cant*Pretu)

from Facturi, Clienti, Detalii, Produse

where Facturi.Nrf = Detalii.Nrf

and Facturi.Codc = Clienti.Codc

and Detalii.Codp = Produse.Codp

group by Facturi.Codc, Nume, Localit,

Adresa;

În pasul al doilea putem extrage informațiile care ne interesează:

Select Codc, Nume, Localit, Adresa, Val

from Valori where Val =

(Select max(Val) from Valori);

Exemplul 4 – evidența comenzilor

Furnizori (Codf, Nume, Localit, Adresa)

Produse (Codp, Denp)

Oferte (Codf, Codp, Pretu)

Comenzi (Nrc, Datac, Codf)

Detalii (Nrf, Codp, Cant)

Dorim să știm care este valoarea fiecărei comenzi:

Select Comenzi.Nrc, Datac, Comenzi.Codf, Nume,

Localit, Adresa, Sum(Cant*Pretu)

from Furnizori, Oferte, Comenzi, Detalii

where Comenzi.Nrc = Detalii.Nrc

and Detalii.Codp = Oferte.Codp

and Comenzi.Codf = Furnizori.Codf

and Detalii.Codp = Oferte.Codp

and Comenzi.Nrf = Oferte.Codf

group by Comenzi.Nrc, Datac, Comenzi.Codf,

Nume, Localit, Adresa;

Am fost nevoiți să punem toate cele patru condiții de legătură, deoarece informațiile despre prețurile produselor se află în tabela Oferte – fiecare produs poate avea prețuri diferite de la un furnizor la altul.

Ne interesează de unde putem achiziționa fiecare produs la cel mai mic preț:

Select Produse.Codp, Denp, Pretu,

Furnizori.Codf, Nume, Localit, Adresa

from Oferte as O, Furnizori as F,

Produse as P

where O.Codf =

(Select Codf from Oferte as Q

where P.Codp = Q.Codp

and Pretu =

(Select min(Pretu) from Oferte))

and O.Codf = F.Codf

and O.Codp = P.Codp;

Exemplul 5 – o evidență detaliată a studenților:

Studenti (Nls, Nume, Prof, An)

Discipline (Codd, Dend, Prof, An)

Profile (Codp, Denp)

Notele (Nls, Codd, Nota)

Această evidență presupune gestiunea a patru tabele. Primele trei tabele le numim tabele primare, deoarece datele primare se introduc în tabelele Studenti, Discipline, Profile. Tabela Notele păstrează informații care presupun o corelare între celelalte trei tabele, deci nu putem introduce oricum datele de intrare. Presupunem că avem toate datele introduse în tabelele primare și dorim să pregătim tabela Notele pentru a putea introduce ulterior și notele de la examene. Folosim o instrucțiune Insert pentru a introduce în tabelă rezultatul unei selecții:

Insert into Notele (Nls, Codd)

Select Nls, Codd from Studenti, Discipline

where Studenti.Prof = Discipline.Prof

and Studenti.An = Discipline.An;

Instrucțiunea Select de mai sus efectuează produsul cartezian al celor două tabele, și selectează acele înregistrări pentru care sînt îndeplinite condițiile din clauza where. Aceste condiții nu sunt de legătură, deoarece între atributele implicate nu există o legătură de tip cheie primară – cheie externă.

După ce am introdus notele dorim o situație a mediilor, ordonată pe profile, ani de studiu, medie (descrescător), nume (alfabetic):

Select Notele.Nls, Nume, Prof, Denp, An,

avg(Nota) as Media

from Notele, Studenti, Profile

where Notele.Nls = Studenti.Nls

and Studenti.Prof = Cods

group by Notele.Nls, Nume, Prof, Denp, An

order by 3,5,6,2;

2.3.4. Utilizarea instrucțiunii Select SQL în actualizare

Am văzut mai sus cum se utilizează instrucțiunea Select SQL în conexiune cu instrucțiunea Insert. Putem cere în plus actualizarea (modificarea sau ștergerea) unor înregistrări care îndeplinesc anumite condiții, și care se exprimă cu ajutorul unor selecții.

Un exemplu: în preajma unor sărbători (de Crăciun sau Paște) un furnizor (căruia îi știm numele, dar nu și codul) anunță reduceri de preț cu 15%. Aceste modificări se operează astfel:

Update Oferte Set Pretu = Pretu * 0.85

where Codf =

(Select Codf from Furnizori

where Nume = '…');

În locul punctelor de suspensie introducem numele furnizorului. În mod asemănător se poate folosi instrucțiunea Select SQL în conexiune cu instrucțiunea Delete.

O problemă propusă

Într-o bază de date pentru evidența stocurilor avem înregistrate următoarele informații:

– despre depozite: cod depozit, adresa;

– despre produse: cod produs, denumire, preț unitar, unitate de măsură;

– despre stocuri: cod depozit, cod produs, stocul existent.

Să se scrie o interogare Select SQL care obține pentru fiecare produs stocul total (cumulat din toate depozitele) și valoarea totală a stocului.

2.4. Proiectarea bazelor de date

Ideea centrală care stă la baza proiectării unei baze de date relaționale este aceea de dependență a datelor. Aceasta se referă la faptul că între atributele unei relații sau între atribute din relații diferite pot exista anumite legături logice (dependențe) și acestea influențează proprietățile relațiilor în raport cu operațiile de actualizare a bazei de date.

2.4.1. Dependențe funcționale

Presupunem că am proiectat o relație cu următoarea structură:

ClFacturi (Nrf, Codc, Nume, Adresa, Dataf)

Observăm dependența atributelor Nume și Adresa față de atributul Codc, și de aici rezultă că fiecare valoare a atributului Codc determină în mod univoc valoarea corespunzătoare a celorlalte două atribute. Această structură (schemă de relație) introduce o redundanță relativ la atributele Nume și Adresa, ale căror valori se repetă pentru fiecare factură a aceluiași client. Această redundanță conduce la următoarele anomalii:

– la adăugare: nu se poate înregistra un potențial client decât după ce se emite o factură pentru acesta;

– la ștergere: dacă se șterg toate facturile emise pentru un anumit client se pierd toate informațiile despre acesta; ulterior, dacă acesta cumpără niște produse, informațiile pe care tocmai le-am șters trebuie introduse din nou;

– la modificare: dacă se modifică o informație despre un anumit client (numele, adresa), este necesară parcurgerea întregii relații pentru a actualiza toate aparițiile acestui client; în caz contrar apare pericolul introducerii unei inconsistențe în baza de date datorită faptului că pentru același client sunt înregistrate informații diferite.

Aceste anomalii pot fi evitate dacă se descompune relația ClFacturi în două relații: Clienti și Facturi, avînd structurile:

Clienti (Codc, Nume, Adresa)

Facturi (Nrf, Codc, Dataf)

Un „dezavantaj” al descompunerii efectuate este acela că pentru a obține informațiile despre un client pentru care am emis o factură este necesară efectuarea unei operații de cuplare a celor două relații. Operația de cuplare (realizată printr-o instrucțiune Select care extrage informații din cele două tabele) nu este atât de costisitoare pe cât ar putea părea la prima vedere, dacă se aleg în mod corespunzător cheile primare și modalitățile de indexare.

După cum rezultă din exemplul de mai sus problema alegerii unui model conceptual corect pentru o bază de date relațională este, de cele mai multe ori, formulată în termenii determinării unor descompuneri pentru scheme de relații date, descompuneri care să izoleze dependențele existente și prin aceasta să se evite anomaliile care decurg din ele.

Definiția 1. Fie R(A1, A2,…, An) o relație, X și Y două atribute (simple sau compuse) submulțimi ale mulțimii de atribute (A1, A2,…, An). Atributul X determină atributul Y (sau Y depinde funcțional de X) și notăm XY dacă și numai dacă orice valoare a atributului X determină în mod unic valoarea atributului Y.

Observații:

– dacă XY atunci pentru orice ZY avem XZ;

– dacă XY atunci pentru orice VX avem VY.

Definiția 2. Fie XY o dependență funcțională; spunem că avem dependență totală dacă nici o submulțime VX nu induce o dependență funcțională VY; în caz contrar, dacă există o submulțime VX care induce o dependență funcțională VY, spunem că avem dependență parțială.

Existența în cadrul relațiilor a dependențelor funcționale este un fapt natural. În orice relație există o dependență funcțională a oricărui atribut față de atributul cheie (sau setul de atribute care formează cheia primară): știm că atributul cheie identifică în mod unic fiecare tuplu.

Dependențele funcționale existente în cadrul unei relații se datorează semanticii segmentului din lumea reală care se modelează prin această schemă și reprezintă restricții referitoare la realitatea modelată. Aceste restricții constituie informații asociate relației și care nu pot fi înglobate în reprezentarea relației, deși se reflectă indirect în această reprezentare prin valorile concrete pe care le iau atributele relației. Singura cale de a determina dependențele funcționale din cadrul unei scheme de relație este aceea de a lua în considerare semnificația tuturor atributelor componente.

2.4.2. Primele trei forme normale

Am arătat mai sus că existența anumitor dependențe funcționale în cadrul unei scheme de relație conduce la o serie de anomalii legate de adăugare, ștergere sau modificare. Am văzut că aceste anomalii pot fi evitate dacă se înlocuiesc schemele de relații date prin altele echivalente, în cadrul cărora dependențele sunt supuse anumitor restricții. Aceste scheme de relații se numesc forme normale. Formele normale constituie criterii de ghidare a proiectantului bazei de date în ceea ce privește alegerea schemelor de relație. Regulile de normalizare se aplică cu scopul de a evita anomaliile legate de adăugare, ștergere sau modificare. Efectul direct al normalizării este reducerea redundanței datelor, redundanță care constituie cauza tuturor acestor anomalii. Prin reducerea redundanței se localizează efectul fiecărei operații de actualizare la un număr cât mai restrâns de tuple, ceea ce înseamnă creșterea gradului de independență reciprocă a tuplelor.

În cadrul acestei note de curs vom studia doar primele trei forme normale, care se definesc pe baza dependențelor funcționale stabilite între cheia primară și celelalte atribute non-cheie ale unei relații. În majoritatea problemelor practice aceste trei forme normale sunt mai mult decât suficiente.

Definiția 3. O relație R este în prima formă normală dacă și numai dacă toate atributele sale iau numai valori atomice (scalare).

Această condiție introduce restricția ca domeniile pe care se definesc atributele relației R să conțină doar valori atomice, ceea ce înseamnă că toate tuplele unei relații au același număr de câmpuri (aceeași dimensiune). Toate atributele unei relații trebuie să fie atribute simple, deci nu pot fi atribute compuse, iar valorile din cadrul tuplelor nu pot fi structuri, vectori sau tuple, Modelul relațional nu studiază relații care au tuple de dimensiuni variabile.

A doua și a treia formă normală rezolvă problemele cauzate de existența dependențelor funcționale dintre atributele cheie și cele non-cheie din cadrul tuplelor. Trecerea unei relații din prima formă normală în a doua formă normală în procesul de normalizare a relațiilor constă în izolarea tuturor dependențelor funcționale și crearea unor relații noi definite cu ajutorul atributelor implicate în aceste dependențe. Pentru fiecare dependență funcțională se creează o relație distinctă. Acest lucru este posibil atunci când relația dată are o cheie multiatribut.

Definiția 4. O relație este în a doua formă normală dacă și numai dacă este în prima formă normală și orice atribut non-cheie este total dependent față de cheia primară a relației.

Pentru orice relație aflată în prima formă normală se poate găsi o descompunere în relații aflate în a doua formă normală care este echivalentă cu relația inițială. Aceasta înseamnă că din relațiile descompunerii se poate reconstitui prin cuplare întreg conținutul de informație al relației inițiale. Așadar înlocuirea unei relații printr-o descompunere a sa în relații aflate în a doua formă normală este un proces reversibil. Avantajul acestei înlocuiri este evitarea unor anomalii legate de operațiile de adăugare, ștergere și modificare. Dar oare sunt evitate toate aceste anomalii?

Exemplu. Fie schema de relație

ProdFact (Nrf, Codc, Dataf, Codp, Cant)

avînd ca și cheie primară setul (Nrf, Codp) și următoarele dependențe funcționale:

– Nrf (Codc,Dataf);

– (Nrf, Codp) Cant; aceasta deoarece pe o factură putem avea mai multe produse, și un același produs poate apărea pe mai multe facturi.

Deoarece setul (Codc, Dataf) depinde total numai de Nrf, redundanța are drept consecință o anomalie la adăugare: pentru fiecare poziție de pe factură aceste informații trebuie repetate. Ca dovadă că se poate mai rău decât în exemplul de mai sus, să ne imaginăm ce consecințe ar avea utilizarea unei structuri cum este cea de mai jos:

ToataFactura (Nrf, Codc, Nume, Adresa, Dataf, Codp, Denp, Pretu, Cant)

Remarcăm o serie de dependențe funcționale, dintre care prezentăm câteva mai semnificative:

Nrf (Codc, Numec, Adresa, Dataf);

Codc (Nume, Adresa);

Codp (Denp, Pretu);

(Nrf, Codp) Cant.

Dependența Nrf (Nume, Adresa) se numește tranzitivă, ea se deduce din următoarele două:

Nrf Codc și Codc (Numec, Adresa)

O ignorăm pentru moment. Să descompunem această schemă astfel:

ClFacturi (Nrf, Codc, Nume, Adresa, Dataf)

Produse (Codp, Denp, Pretu)

Detalii (Nrf, Codp, Cant)

Se poate verifica faptul că toate cele trei scheme se află în a doua formă normală. Recompunerea relației originale se poate face cu ajutorul unei instrucțiuni Select SQL.

Și totuși ceva nu e în regulă cu această descompunere. Încă se observă o redundanță supărătoare în schema ClFacturi, datorită atributelor Nume și Adresa. Aceasta generează aceleași anomalii la adăugare, ștergere sau modificare, deoarece am ignorat dependențele funcționale tranzitive.

Definiția 5. O relație R este în a treia formă normală dacă și numai dacă este în a doua formă normală și toate atributele non-cheie sunt total dependente numai de cheia primară și nu și de alte atribute non-cheie.

Să reluăm exemplul de mai sus. Schema ClFacturi se descompune mai departe astfel:

Clienti (Codc, Nume, Adresa)

Facturi (Nrf, Codc, Dataf)

2.4.3. Proiectarea structurii unei baze de date

Analiza problemei pe care trebuie să o rezolvăm identifică toate informațiile care se introduc în baza de date. Se identifică de asemenea toate corelațiile care există între aceste informații – se identifică în fond dependențele funcționale. Pentru a putea identifica mai ușor aceste corelații se recomandă ca în baza de date fiecare entitate care se înregistrează să aibă o cheie de identificare (un cod). Toate informațiile care se deduc dintr-o astfel de cheie (cod) se înregistrează într-o relație asociată clasei respective de entități. Descompunerea unei scheme de relație se face până când toate schemele de relație se află în a treia formă normală.

Exemplu. Analiza unei probleme de evidență a comenzilor a pus în evidență următoarele informații care trebuie înregistrate în baza de date:

– despre furnizori: cod, nume, adresa; fiecare furnizor își prezintă oferta – o listă de produse: cod, denumire, preț;

– un furnizor poate prezenta mai multe produse pe ofertă, un același produs poate apărea pe ofertele mai multor furnizori cu prețuri diferite; toată lumea folosește un sistem unic de codificare a produselor;

– pe o comandă adresată unui furnizor apare: furnizorul, data comenzii, lista produselor comandate (pentru fiecare produs, cantitatea comandată).

Atributele cu care operăm în continuare sunt:

Codf, Nume, Adresa, Codp, Denp, Pretu, Nrc, Datac, Cant

Dependențele funcționale de bază pe care le-am identificat (am evitat orice dependențe tranzitive):

Codf (Nume, Adresa);

Codp Denp; prețul nu poate apărea aici deoarece el diferă de la un furnizor la altul;

(Codf, Codp) Pret;

Nrc (Codf, Datac);

(Nrc, Codp) Cant.

Din aceste dependențe funcționale de bază se deduc imediat schemele de relație care vor compune baza de date:

Furnizori (Codf, Nume, Adresa);

Produse (Codp, Denp);

Oferte (Codf, Codp, Pret);

Comenzi (Nrc, Codf, Datac);

Detalii (Nrc, Codp, Cant).

3. Generalități despre limbajul PHP

Ce este PHP?

PHP (acronim recursiv pentru "PHP: Hypertext Preprocessor") este un limbaj de scripting utilizat pe scara larg, realizat si distribuit in sistem Open Source, ce se potriveste productiei Web si poate fi incapsulat in HTML.

Observam cum acest exemplu difera fata de un script scris in alte limbaje cum ar fi Perl sau C – in loc de a scrie un program cu o multime de comenzi pentru a produce un HTML, scrii un script HTML ce include cod pentru a realiza ceva (in acest caz, a afisa un text). Codul PHP este delimitat de coduri de start si de sfirsit ce iti permit sa intri si sa iesi din "modul PHP".

Diferenta dintre PHP si altceva cum ar fi JavaScript este acela ca PHP este executat pe server pe cand JavaScript este executat pe calculatorului clientului (de navigatorul de Internet). Daca ar fi sa ai un script similar cu cel de mai sus pe serverul tau, clientul ar primi doar rezultatele scriptului ce este rulat, fara a vedea in nici un fel codul din spatele acestuia. iti poti chiar configura serverul de web ca acesta sa iti proceseze toate fisierele HTML cu PHP si astfel nu exita nici o metoda ca un utilizator sa stie defapt ce exista in fisierele tale.

Cele mai bune lucruri in folosirea PHP-ului sunt ca este foarte simplu pentru un incepator, dar ofera o multime de facilititi avansate pentru un programator prefesional. Si nu-ti fie frica sa citetti lista lunga de functii PHP. Poti sa intri in actiune, intr-un timp scurt, si sa incepi sa scrii scripturi simple in citeva ore.

Desi dezvoltarea PHP-ului este axata pe partea de scripting ce ruleaza pe server, poti sa faci mult mai multe cu el.

Orice.

PHP este in principal axat pe partea de scripting ce ruleaza pe server, deci poti face orice fac și un program CGI, cum ar fi colectarea de date de la formulare, generarea de conținut dinamic sau trimitere si primire de cookie-uri. Dar PHP poate face mult mai multe.

Există trei domenii principale unde sunt folosite scripturile PHP.

Scripturi ce ruleaza pe server. Acesta este cel mai tradițional și cel mai important pentru PHP. Ai nevoie de trei lucrui pentru a face sa meargă. Interpretorul PHP (CGI sau modul de server), un server de web și un navigator de web. E nevoie ca serverul de web si fie pornit, cu o conexiune PHP instalată. Poți accesa rezultatul programelor PHP cu un navigator print intermediul serverului de web.

Scripting la linia de comandă. Poți face ca PHP să ruleze fără a fi nevoie de server și de browser, ci doar de interpretorul PHP. Această metodă este ideală pentru scripturile ce se vor a fi executate regula folosinf cron (task scheduler în Windows), sau sarcini simple de procesare a textelor. Vezi secțiunea despre

Scrierea de aplicații ce rulează de partea clientului în mod grafic (GUI). Probabil cu PHP nu este limbajul cel mai bun de a scrie aplicații cu ferestre pentru Windows sau alte sisteme de operare, dar dacă cunoști PHP foarte bine și vrei să folosești niște facilități avansate a PHP-ului în aplicațiile tale ce ruleaza de partea clientului poți totuși folosi PHP-GTK pentru a scrie astfel de programe. Deasemenea ai posibilitatea de a scrie aplicații ce ruleaza pe platforme diferite folosind această metoda. PHP-GTK este o extensie a PHP-ului, nedisponibila în distribuția principală de PHP.

PHP poate fi folosit pe aproape toate marile sisteme de operare, incluzând Linux, multe variante de Unix (incluzând HP-UX, Solaris și OpenBSD), Microsoft Windows, Mac OS X, RISC OS, probabil și altele. PHP are deasemenea suport pentru majoritatea serverelor de web din prezent. Acestea includ serverele Apache, Microsoft Internet Information Server, Personal Web Server, Netscape și iPlanet, serverul Oreillz Website Pro, Caudium, Xitami, OmniHTTPd, și multe atele. Pentru majoritatea serverelor PHP are un modul, iar pentru celelalte suportă standardul CGI, PHP putând să lucreze ca un procesor CGI.

Deci, cu PHP, ai libertatea de a alege un sistem de operare și un server de web. Chiar mai mult, ai posibilitatea de a alege programarea procedurală sau programarea orientată obiect, sau chiar sa le amesteci. Cu toate acestea, nu orice facilitate a standardului POO este prezentă în versiunea curent a PHP-ului, multe librării de cod și aplicații mari (incluzând și librăria PEAR) sunt scrise folosind doar cos POO.

Cu PHP nu ești limitat să scoți rezultat HTML. Posibilit��ile PHP-ului includ afișarea de imagine, fișiere PDF și chiar filmulețe Flash (folosind librăriile libswf și Ming) toate generate instant. Poți deasemeanea ca rezultatul tău să fie orice fișier text, cum ar fi XHTML sau orice alte fișiere XML. PHP poate genera autmoat aceste fișiere și să le salveze în sistemul de fișiere un loc să le afișeze, formând un cache de partea serverului pentru continutul tău dinamic.

Una dintre cele mai puternice și importante facilității în PHP este suportul său pentru o gamă larga de baze de date. Scrierea une pagini de web ce interacționeaza cu o bază de date este incredibil de simplu.

Următoarele baze de date sunt suportate:

Deasemenea avem o extensie abstracta a bazei de date DBX ceea ce-i permite într-un mod transparent dolosirea oricărei bazei de date ce suportă această extensie. Mai mult, PHP suportă ODBC, standardul Open Database Connectio, deci te poți conecta la orice altă bază de date ce suporta acest standard mondial.

PHP are deasemeanea suport pentru a conversa cu alte servicii folosind protocoale cum ar fi LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (pe Windows) și multe altele. Poți deasemenea deschide deasemenea socket-uri de rețea și să interacționezi între aproape toate limbajele de programare Web. Apropo de interconectare, PHP are suport pentru instanțierea obiectelor Java și utilizarea lor �ntr-un mod transparent ca obiecte PHP. Poți deasemenea folosi extensii CORBA pentru a accesa obiecte aflate la distanță.

PHP are capabilități extrem de folositoare pentru procesarea textului, de la POSIX Extins sau expresii regulare Perl până la parsarea documentelor XML. Pentru parsarea și accesarea documentelor XML, suport�m standardele SAX și DOM. Poți folosi extensia noastra XSLT pentru a transforma documentele XML.

Folosind PHP în domeniul comer�ului electronic, vei descoperi foarte folositoare pentru programul tău de plați online funcții de plată Cybercash, CyberMUT, VeriSign Payflow Pro și CCVS.

În cele din urmă, dar nu ultimul rând, avem și alte extensii interesante, cum ar fi funcții ale motorului de căutare mnoGoSearch, funcții pentru accesarea IRC-ului, multe utilitare de compresie (gzip, bz2), conversie de calendar, traducere…

4. Descrierea aplicației

Prima pagina, este pagina de autentificare a administratorului. Pentru a putea accesa aplicatia administratorul trebuie sa se autentifice pe prima pagina, aceasta operatiune constind in completarea a doua cimpuri: primul este numele utilizatorului si al doilea fiind parola. Aceste date se compara cu cele introduse de administrator la crearea contului de administrator accesul fiind permis numai la introducerea corecta a datelor.

Numele de administrator este creat o singura data intr-un fisier, urmind ca parola sa poata fi modificata ulterior in interiorul aplicatiei, pentru aceasta fiind alocata o sectiune speciala.

Dupa autentificare utilizatorul acceseaza pagina principala a programului care contine meniul aplicatiei impreuna cu un mesaj de intimpinare pentru administrator.

Aplicatia este protejata printr-o sesiune de inregistrare, astfel ca in cazul uitarii aplicatiei deschise mai mult timp sesiunea expira utilizatorul fiind nevoit sa se inregistreze din nou, fiind redirectionat catre pagina de autentificare.

Meniul contine 6 sectiuni: Prima Pagina, Carti, Fise, Rapoarte, Contul Meu, Iesire

Prima pagina: prima pagina contine mesajul de bun venit catre utilizator.

Carti: Acesta sectiune contine titlul si autorul cartii cit si data la care aceasta carte a fost introdusa in biblioteca, cit si o casuta de validare pentru stergere. Acesta sectiune mai contine si un submeniu format din submeiurile Adauga, Sterge si mai contine si o cautare avansata foarte utila in cazul in care utilizatorul doreste sa caute dupa anumite criteria.

Tabelul contine cite 25 de inregistrari pe fiecare pagina jos fiind afisat numarul de pagini la sectiunea Pagini si pagina care este vizualizata in momentul respective la sectiunea Pagini.

Adauga: la acest submeniu utilizatorul are un tabel cu 3 cimpuri toate fiind obligatorii: primul pentru numarul intern, al doilea pentru numele autorului si al treilea pt titlul publicatiei, cit si butonul inregistreaza. Toate cele trei cimpuri sunt de tip character si se insereaza in baza de date ca atare, cimpuriile fiind obligatori, in cazul necompletarii unui cimp inserarea in baza de date nefiind efectuata.

Sterge: submeniul sterge poate fi utilizat doar in momentul in care una sau mai multe casute din tabelul cartilor din coloana sterge este bifata, in acest moment efectuindu-se stergerea inregistrari sau inregistrarilor selectate din baza de date. Ca o masura de protectie pentru evitarea erorilor se afiseaza un mesaj de eroare care instiinteaza utilizatorul ca urmeaza sa efectueze o stergere de date din baza de date aceasta operatiune fiind ireversibila.

Cautare: Submeniul cautare este postat in partea stinga a paginii din meniul Carti, ea avind 3 cimpuri: Autor, Titlu, Nr. Intern. Se poate efectua o interogare a cimpurilor tabelei carti dupa toate aceste trei criterii sau doar dupa unul sau doua. La cimpurile Autor si Titlu se poate introduce si o combinatie 1 sau mai multe litere ex: la titlu daca se introduce litera A si se interogheaza baza de date, vor fi afisate toate publicatiile care au fost inserate in tabela si incep cu litera A.

Aceasta cautare a fost realizata pentru a veni in ajutorul utilizatorului si a usura munca de cautare a unuia sau mai multor inserari in baza de date sau a eventualei disponibilitati a acelei publicatii.

Fise: Sectiunea fise este destinata inserarii si administrarii tuturor abonatilor bibliotecii. Aceasta sectiune contine submeiul Adauga, Sterge si Cautare.

In aceasta sectiune sunt afisati toti abonatii bibliotecii intr-un tabel dupa: Numar permis, Nume, Prenume, Judet, Oras, Data inscrierii, Imprumut. Acest tabel mai contine si casuta Sterge folosit la stergerea utilizatorilor.

Tabelul contine cite 25 de inregistrari pe fiecare pagina jos fiind afisat numarul de pagini la sectiunea Pagini si pagina care este vizualizata in momentul respective la sectiunea Pagina curenta.

Submeniul Adauga contine un table cu cimpurile necesare pentru inregistrarea unui abonat si sunt dupa cum urmeaza: Numar Permis, Nume, Prenume, Judet(un cimp de unde utilizatorul selecteaza un jutet din cele disponibile in Romania), Oras, Adresa, Seria BI (actului de identitate) , si Nota, un cimp necesar pt diferite mentiuni eventuale.

Toate cimpurile sunt obligatorii in cazul necompletarii unuia din ele inserarea in baza de date nefiind efecutata. Daca au fost completate toate cimpurile se efectueaza inserearea utilizatorul fiind redirectionat la prima pagina a Sectiunii Fise unde poate vedea pe ulitma inregistrare din tabel inregistrarea efectuata.

Sterge: submeniul sterge poate fi utilizat doar in momentul in care una sau mai multe casute din tabelul abonatilor din coloana sterge este bifata, in acest moment efectuindu-se stergerea inregistrari sau inregistrarilor selectate din baza de date. Ca o masura de protectie pentru evitarea erorilor se afiseaza un mesaj de eroare care instiinteaza utilizatorul ca urmeaza sa efectueze o stergere de date din baza de date aceasta operatiune fiind ireversibila.

Cautare: Optiunea cautare cuprinde un table cu cimpurile Nume Prenume Judet Oras si Nr. Permis, si butonul cauta. Utilizatorul are optiunea sa caute dupa una sau mai multe criterii rezultatele fiind afisate in functie de criteriul folosit la cautare es: daca selecteaza din cimpul Judet, judetul Alba, rezultatele afisate vor fi toti abonatii inregistrati din judetul alba.

Rapoarte:

Sectiunea este destinata contabilizarii tuturor cartilor care sunt imprumutate. Contine o sectiune in care se pot face selectia pe 2 tipuri de rapoarte:

Restituiri la data curenta, accesind acest tip de raport se tipareste tabelul cu toti abonatii care trebuie sa inapoieze cartile la data respective, ajutind astfel administratorul care va sti exact cite carti trebuie restituite in ziua respective.

Intirzieri, acest tip de raport tipareste un tabel cu toti abonatii care au intirziat predarea cartilor imprumutate. Avantajul acestui program este ca o carte imprumutata déjà unui abonat nu poate fi imprumutata si altui abonat pina aceasta carte nu a fost restituita.

Tabelul din centrul acestei sectiune este tiparit in functie de tipul de rapoarte cerut de catre administrator si contine urmatoarele date ale abonatilor: Numarul permisului (pentru a face mult mai usor o eventual cautare a abonatului dupa acest numar la sectiunea fise), Nume , Prenume, Numar Carti imprumutate (acest cimp usurind munca administartorului, scotind in evidenta numarul total de carti imprumutate de abonatul respectiv), Imprumut (acest cimp fiind buton catre sectiunea si aratind exact la ce data au fost imprumutate fiecare dintre cartile ce sunt retinute in contul abonatului respectiv).

Tabelul contine cite 25 de inregistrari pe fiecare pagina jos fiind afisat numarul de pagini la sectiunea Pagini si pagina care este vizualizata in momentul respective la sectiunea Pagina Curenta.

Contul Meu:

Sectiunea Contul Meu a fost creata pentru adminsitrarea contulu de administrator al acestei aplicatii. Contine un tabel cu 3 cimpuri pentru schimbarea parolei curente. In primul cimp se introduce parola curenta, in al doilea cimp se introduce paola noua, iar in al treilea cimp se introduce din nou parola noua (se confirma noua parola). Aceasta sectiune este necesara pentru mai buna protejare a aplicatiei adminiatratorul avind posibilitatea sa schimbe parola ori de cite ori doreste si considera ca este necesar.

Iesire:

Aceasta sectiune este folosita pentru a inchide aplicatia mai précis pentru a inchide sesiunea de logare nefiind necesar sa se inchida aplicatia, la apasare butonului de Iesire sesiunea este inchisa iar utilizatorul este redirectat catre prima pagina (pagina de autentificare.)

4.1. Analiza problemei

Tabelele menționate mai sus sunt următoarele:

Fiecare tabel conține o cheie primară (PK), cheie ce va fi cheie străină (FK) în alte tabele, care conține o informație valoroasă, cea mai importantă, deoarece dacă cunoaștem această cheie vom afla toate datele necesare.

4.2. Relațiile între tabele

Relația între tabela Cărți și tabela Fișă este (1,1)

Relația între tabela Cărți și Conturi este (1,1)

4.3. Tabele de descriere

4.4. Crearea tabelelor

CREATE TABLE `carti` (

`ID` bigint(20) NOT NULL auto_increment,

`Autor` varchar(100) collate latin1_general_ci NOT NULL,

`Titlu` varchar(100) collate latin1_general_ci NOT NULL,

`Nr_int` varchar(50) collate latin1_general_ci NOT NULL,

`Data` date NOT NULL,

`StareCurenta` tinyint(4) NOT NULL,

`ImprumutPina` date NOT NULL,

`IDFisa` bigint(20) NOT NULL,

UNIQUE KEY `ID` (`ID`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

AUTO_INCREMENT=21 ;

CREATE TABLE `conturi` (

`ID` int(11) NOT NULL auto_increment,

`UserName` varchar(25) collate latin1_general_ci NOT NULL,

`Password` varchar(150) collate latin1_general_ci NOT NULL,

UNIQUE KEY `ID` (`ID`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

AUTO_INCREMENT=2 ;

CREATE TABLE `fisa` (

`ID` bigint(20) NOT NULL auto_increment,

`Nume` varchar(50) collate latin1_general_ci NOT NULL,

`Prenume` varchar(50) collate latin1_general_ci NOT NULL,

`Judet` tinyint(4) NOT NULL,

`Oras` varchar(50) collate latin1_general_ci NOT NULL,

`Adresa` varchar(256) collate latin1_general_ci NOT NULL,

`BI` varchar(50) collate latin1_general_ci NOT NULL,

`Nota` text collate latin1_general_ci NOT NULL,

`Numar_permis` varchar(50) collate latin1_general_ci NOT NULL,

`Data` date NOT NULL,

UNIQUE KEY `ID` (`ID`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

AUTO_INCREMENT=5 ;

Concluzii și propuneri

Această aplicație este realizată cu ajutorul limbajului de script PHP și a programului de baze de date MySql. Principalele argumente în realizarea acestei lucrări au, folosirea eficientă a unei baze de date prin intermediul unui mediu interactiv ușor de utilizat, cum ar fi browserele: Internet Explorer, Opera și mai recentul Mozila Firefox ș.a.

PHP este un limbaj de script relativ nou care este folosit in special pentru lucrul cu baze de date. Introducerea, extragerea și manipularea datelor dintre PHP și MySql se realizează prin intermediul unui server web sau de rețea locală.

Ca urmare a dezvoltarii acestei aplicatii orice biblioteca, fie oraseneasca fie judeteana fie studenteasca, municipal etc. isi usureaza munca adminsitratorului (bibliotecarului), nemaifiind necesara utilizarea fiselor scrise pe hirtie cit si a registrelor de evident ale abonatilor si ale cartilor.

Totodata se usureaza si gestiunea cartilor din stoc, a celor imprumutate si a abonatilor care nu au predate cartile la termenul stabilit, in acest fel eliminindu-se orice fel de tip de tinere a evidentei scrise cu registre fise de intrare fise de abonat, etc . etc.

Investitia pentru orice fel de biblioteca este minima si este sub nivelul investitiei necesarului de produse de birotica necesare unei biblioteci la inceperea activitatii. Este necesara doar achizitionarea unui calculator de performanta medie (Pentium 1) cit si a unei conexiuni la internet cu o largime de banda destul de redusa aplicatia fiind optimizata sa ruleze pe conexiuni de internet cu viteza redusa, si a unui domeniu de internet cu support de php si mysql.

De asemenea stocarea bazei de date pe un server de web este foarte avantajoasa in cazul defectarii unor component ale calculatorului practic aplicatia nerulind local toate datele fiind salvate pe serverul de web unde a fost creat contul.

Astfel baza de date si aplicatia ramin intacte iar costul de mentinere si implementare al acestui program fiind minime si usor de realizat in comparatie cu ofertele actuale pe acest segment de piata.

Bibliografie

1. Ion Cozac – „Baze de date, note de curs”

2. Kevin Yank –

„Building a Database – Driven Web Site Using PHP and MySql”

3. Paul Wilton – „Beginning SQL”

4. www.mysql.com

5. www.opencontent.org/openpub/

6. www.mie.ro

7. www.php.net

8. http://en.wikipedia.org/wiki/PHP

9. http:// www.mysql.com

=== documentatie ===

Soft pentru Biblioteca

Introducere:

Aceasta aplicatie este destinata utilizarii in bibiliotecile scolare univeristare cit si cele publice. Este un soft creat pe web care nu necesita din partea administratorului decit o conexiune la internet.

Aplicatia a fost scrisa in php versiunea 4.1 si mysql versiunea 4.0. Aplicatia este destinata gestiunii membrilor abonati ai unei biblioteci cit si a evidentei cartilor existente in aceasata biblioteca si a imprumuturilor catre abonati.

Aplicatia necesita o platform de rulare cu support php si mysql. Aplicatia a fost scris in acest limbaj deoarece este cel mai larg folosit limbaj de dezvoltare web cit si datorita faptului ca este cel mai accesibil limbaj atit ca si limbaj de dezvoltare cit si ca baza de date.

Cuprins:

Prima pagina, este pagina de autentificare a administratorului. Pentru a putea accesa applicatia administratorul trebuie sa se autentifice pe prima pagina, aceasta operatiune constind in completarea a doua cimpuri: primul este numele utilizatorului si al doilea fiind parola. Aceste date se compara cu cele introduse de administrator la crearea contului de administrator accesul fiind permis numai la intorducerea corecta a datelor.

Numele de administrator este creat o singura data intr-un fisier, urmind ca parola sa poata fi modificata ulterior in interiorul aplicatiei, pentru aceasta fiind alocata o sectiune speciala.

Dupa autentificare utilizatorul acceseaza pagina principala a programului care contine meniul applicatiei impreuna cu un mesaj de intimpinare pentru administrator.

Aplicatia este protejata printr-o sesiune de inregistrare, astfel ca in cazul uitarii aplicatiei deschise mai mult timp sesiunea expira utilizatorul fiind nevoit sa se inregistreze din nou, fiind redirectionat catre pagina de autentificare.

Meniul contine 6 sectiuni: Prima Pagina, Carti, Fise, Rapoarte, Contul Meu, Iesire

Prima pagina: prima pagina contine mesajul de bun venit catre utilizator.

Carti: Acesta sectiune contine titlul si autorul cartii cit si data la care aceasta carte a fost introdusa in biblioteca, cit si o casuta de validare pentru stergere. Acesta sectiune mai contine si un submeniu format din submeiurile Adauga, Sterge si mai contine si o cautare avansata foarte utila in cazul in care utilizatorul doreste sa caute dupa anumite criteria.

Tabelul contine cite 25 de inregistrari pe fiecare pagina jos fiind afisat numarul de pagini la sectiunea Pagini si pagina care este vizualizata in momentul respective la sectiunea Pagini.

Adauga: la acest submeniu utilizatorul are un tabel cu 3 cimpuri toate fiind obligatorii: primul pentru numarul intern, al doilea pentru numele autorului si al treilea pt titlul publicatiei, cit si butonul inregistreaza. Toate cele trei cimpuri sunt de tip character si se insereaza in baza de date ca atare, cimpuriile fiind obligatori, in cazul necompletarii unui cimp inserarea in baza de date nefiind efectuata.

Sterge: submeniul sterge poate fi utilizat doar in momentul in care una sau mai multe casute din tabelul cartilor din coloana sterge este bifata, in acest moment efectuindu-se stergerea inregistrari sau inregistrarilor selectate din baza de date. Ca o masura de protectie pentru evitarea erorilor se afiseaza un mesaj de eroare care instiinteaza utilizatorul ca urmeaza sa efectueze o stergere de date din baza de date aceasta operatiune fiind ireversibila.

Cautare: Submeniul cautare este postat in partea stinga a paginii din meniul Carti, ea avind 3 cimpuri: Autor, Titlu, Nr. Intern. Se poate efectua o interogare a cimpurilor tabelei carti dupa toate aceste trei criterii sau doar dupa unul sau doua. La cimpurile Autor si Titlu se poate introduce si o combinatie 1 sau mai multe litere ex: la titlu daca se introduce litera A si se interogheaza baza de date, vor fi afisate toate publicatiile care au fost inserate in tabela si incep cu litera A.

Aceasta cautare a fost realizata pentru a veni in ajutorul utilizatorului si a usura munca de cautare a unuia sau mai multor inserari in baza de date sau a eventualei disponibilitati a acelei publicatii.

Fise: Sectiunea fise este destinata inserarii si administrarii tuturor abonatilor bibliotecii. Aceasta sectiune contine submeiul Adauga, Sterge si Cautare.

In aceasta sectiune sunt afisati toti abonatii bibliotecii intr-un tabel dupa: Numar permis, Nume, Prenume, Judet, Oras, Data inscrierii, Imprumut. Acest tabel mai contine si casuta Sterge folosit la stergerea utilizatorilor.

Tabelul contine cite 25 de inregistrari pe fiecare pagina jos fiind afisat numarul de pagini la sectiunea Pagini si pagina care este vizualizata in momentul respective la sectiunea Pagina curenta.

Submeniul Adauga contine un table cu cimpurile necesare pentru inregistrarea unui abonat si sunt dupa cum urmeaza: Numar Permis, Nume, Prenume, Judet(un cimp de unde utilizatorul selecteaza un jutet din cele disponibile in Romania), Oras, Adresa, Seria BI (actului de identitate) , si Nota, un cimp necesar pt diferite mentiuni eventuale.

Toate cimpurile sunt obligatorii in cazul necompletarii unuia din ele inserarea in baza de date nefiind efecutata. Daca au fost completate toate cimpurile se efectueaza inserearea utilizatorul fiind redirectionat la prima pagina a Sectiunii Fise unde poate vedea pe ulitma inregistrare din tabel inregistrarea efectuata.

Sterge: submeniul sterge poate fi utilizat doar in momentul in care una sau mai multe casute din tabelul abonatilor din coloana sterge este bifata, in acest moment efectuindu-se stergerea inregistrari sau inregistrarilor selectate din baza de date. Ca o masura de protectie pentru evitarea erorilor se afiseaza un mesaj de eroare care instiinteaza utilizatorul ca urmeaza sa efectueze o stergere de date din baza de date aceasta operatiune fiind ireversibila.

Cautare: Optiunea cautare cuprinde un table cu cimpurile Nume Prenume Judet Oras si Nr. Permis, si butonul cauta. Utilizatorul are optiunea sa caute dupa una sau mai multe criterii rezultatele fiind afisate in functie de criteriul folosit la cautare es: daca selecteaza din cimpul Judet, judetul Alba, rezultatele afisate vor fi toti abonatii inregistrati din judetul alba.

Rapoarte:

Sectiunea este destinata contabilizarii tuturor cartilor care sunt imprumutate. Contine o sectiune in care se pot face selectia pe 2 tipuri de rapoarte:

Restituiri la data curenta, accesind acest tip de raport se tipareste tabelul cu toti abonatii care trebuie sa inapoieze cartile la data respective, ajutind astfel administratorul care va sti exact cite carti trebuie restituite in ziua respective.

Intirzieri, acest tip de raport tipareste un tabel cu toti abonatii care au intirziat predarea cartilor imprumutate. Avantajul acestui program este ca o carte imprumutata déjà unui abonat nu poate fi imprumutata si altui abonat pina aceasta carte nu a fost restituita.

Tabelul din centrul acestei sectiune este tiparit in functie de tipul de rapoarte cerut de catre administrator si contine urmatoarele date ale abonatilor: Numarul permisului (pentru a face mult mai usor o eventual cautare a abonatului dupa acest numar la sectiunea fise), Nume , Prenume, Numar Carti imprumutate (acest cimp usurind munca administartorului, scotind in evidenta numarul total de carti imprumutate de abonatul respectiv), Imprumut (acest cimp fiind buton catre sectiunea si aratind exact la ce data au fost imprumutate fiecare dintre cartile ce sunt retinute in contul abonatului respectiv).

Tabelul contine cite 25 de inregistrari pe fiecare pagina jos fiind afisat numarul de pagini la sectiunea Pagini si pagina care este vizualizata in momentul respective la sectiunea Pagina Curenta.

Contul Meu:

Sectiunea Contul Meu a fost creata pentru adminsitrarea contulu de administrator al acestei aplicatii. Contine un tabel cu 3 cimpuri pentru schimbarea parolei curente. In primul cimp se introduce parola curenta, in al doilea cimp se introduce paola noua, iar in al treilea cimp se introduce din nou parola noua (se confirma noua parola). Aceasta sectiune este necesara pentru mai buna protejare a aplicatiei adminiatratorul avind posibilitatea sa schimbe parola ori de cite ori doreste si considera ca este necesar.

Iesire:

Aceasta sectiune este folosita pentru a inchide aplicatia mai précis pentru a inchide sesiunea de logare nefiind necesar sa se inchida aplicatia, la apasare butonului de Iesire sesiunea este inchisa iar utilizatorul este redirectat catre prima pagina (pagina de autentificare.)

Concluzii si Propuneri

Ca urmare a dezvoltarii acestei aplicatii orice biblioteca, fie oraseneasca fie judeteana fie studenteasca, municipal etc. isi usureaza munca adminsitratorului (bibliotecarului), nemaifiind necesara utilizarea fiselor scrise pe hirtie cit si a registrelor de evident ale abonatilor si ale cartilor.

Totodata se usureaza si gestiunea cartilor din stoc, a celor imprumutate si a abonatilor care nu au predate cartile la termenul stabilit, in acest fel eliminindu-se orice fel de tip de tinere a evidentei scrise cu registre fise de intrare fise de abonat, etc . etc.

Investitia pentru orice fel de biblioteca este minima si este sub nivelul investitiei necesarului de produse de birotica necesare unei biblioteci la inceperea activitatii. Este necesara doar achizitionarea unui calculator de performanta medie (Pentium 1) cit si a unei conexiuni la internet cu o largime de banda destul de redusa aplicatia fiind optimizata sa ruleze pe conexiuni de internet cu viteza redusa, si a unui domeniu de internet cu support de php si mysql.

De asemenea stocarea bazei de date pe un server de web este foarte avantajoasa in cazul defectarii unor component ale calculatorului practic aplicatia nerulind local toate datele fiind salvate pe serverul de web unde a fost creat contul.

Astfel baza de date si aplicatia ramin intacte iar costul de mentinere si implementare al acestui program fiind minime si usor de realizat in comparatie cu ofertele actuale pe acest segment de piata.

Bibliografie

Ce este PHP?

PHP (acronim recursiv pentru "PHP: Hypertext Preprocessor") este un limbaj de scripting utilizat pe scara larg, realizat si distribuit in sistem Open Source, ce se potriveste productiei Web si poate fi incapsulat in HTML.

Observam cum acest exemplu difera fata de un script scris in alte limbaje cum ar fi Perl sau C – in loc de a scrie un program cu o multime de comenzi pentru a produce un HTML, scrii un script HTML ce include cod pentru a realiza ceva (in acest caz, a afisa un text). Codul PHP este delimitat de coduri de start si de sfirsit ce iti permit sa intri si sa iesi din "modul PHP".

Diferenta dintre PHP si altceva cum ar fi JavaScript este acela ca PHP este executat pe server pe cand JavaScript este executat pe calculatorului clientului (de navigatorul de Internet). Daca ar fi sa ai un script similar cu cel de mai sus pe serverul tau, clientul ar primi doar rezultatele scriptului ce este rulat, fara a vedea in nici un fel codul din spatele acestuia. iti poti chiar configura serverul de web ca acesta sa iti proceseze toate fisierele HTML cu PHP si astfel nu exita nici o metoda ca un utilizator sa stie defapt ce exista in fisierele tale.

Cele mai bune lucruri in folosirea PHP-ului sunt ca este foarte simplu pentru un incepator, dar ofera o multime de facilititi avansate pentru un programator prefesional. Si nu-ti fie frica sa citetti lista lunga de functii PHP. Poti sa intri in actiune, intr-un timp scurt, si sa incepi sa scrii scripturi simple in citeva ore.

Desi dezvoltarea PHP-ului este axata pe partea de scripting ce ruleaza pe server, poti sa faci mult mai multe cu el.

Orice. PHP este in principal axat pe partea de scripting ce ruleaza pe server, deci poti face orice fac �i un program CGI, cum ar fi colectarea de date de la formulare, generarea de con�inut dinamic sau trimitere si primire de cookie-uri. Dar PHP poate face mult mai multe.

Exist� trei domenii principale unde sunt folosite scripturile PHP.

Scripturi ce ruleaza pe server. Acesta este cel mai tradi�ional �i cel mai important pentru PHP. Ai nevoie de trei lucrui pentru a face sa mearg�. Interpretorul PHP (CGI sau modul de server), un server de web �i un navigator de web. E nevoie ca serverul de web s� fie pornit, cu o conexiune PHP instalat�. Po�i accesa rezultatul programelor PHP cu un navigator print intermediul serverului de web. Vezi sectiunea instruc�iuni de instalare pentru mai multe detalii.

Scripting la linia de comand�. Po�i face ca PHP s� ruleze f�r� a fi nevoie de server �i de browser, ci doar de interpretorul PHP. Aceast� metod� este ideal� pentru scripturile ce se vor a fi executate regula folosinf cron (task scheduler �n Windows), sau sarcini simple de procesare a textelor. Vezi sec�iunea despre Folosirea PHP-ului �n linie comand� pentru mai multe informa�ii.

Scrierea de aplica�ii ce ruleaz� de partea clientului �n mod grafic (GUI). Probabil c� PHP nu este limbajul cel mai bun de a scrie aplica�ii cu ferestre pentru Windows sau alte sisteme de operare, dar dac� cuno�ti PHP foarte bine �i vrei vrei s� folose�ti ni�te facilit��i avansate a PHP-ului �n aplica�iile tale ce ruleaza de partea clientului po�i totu�i folosi PHP-GTK pentru a scrie astfel de programe. Deasemenea ai posibilitatea de a scrie aplica�ii ce ruleaza pe platforme diferite folosind aceast� metoda. PHP-GTK este o extensie a PHP-ului, nedisponibila �n distribu�ia principal� de PHP. Dac� e�ti interesat de PHP-GTK viziteaz� propiul lui site..

PHP poate fi folosit pe aproape toate marile sisteme de operare, incluz�nd Linux, multe variante de Unix (incluz�nd HP-UX, Solaris �i OpenBSD), Microsoft Windows, Mac OS X, RISC OS, probabil �i altele. PHP are deasemenea suport pentru majoritatea serverelor de web din prezent. Acestea includ serverele Apache, Microsoft Internet Information Server, Personal Web Server, Netscape �i iPlanet, serverul Oreillz Website Pro, Caudium, Xitami, OmniHTTPd, �i multe atele. Pentru majoritatea serverelor PHP are un modul, iar pentru celelalte suport� standardul CGI, PHP put�nd s� lucreye ca un procesor CGI.

Deci, cu PHP, ai libertatea de a alege un sistem de operare �i un server de web. Chiar mai mult, ai posibilitatea de a alege programarea procedural� sau programarea orientat� obiect, sau chiar sa le amesteci. Cu toate acestea, nu orice facilitate a standardului POO este prezent� �n versiunea curent a PHP-ului, multe libr�rii de cod �i aplica�ii mari (incluz�nd �i libr�ria PEAR) sunt scrise folosind doar cos POO.

Cu PHP nu e�ti limitat s� sco�i rezultat HTML. Posibilit��ile PHP-ului includ afi�area de imagine, fi�iere PDF �i chiar filmule�e Flash (folosind libr�riile libswf �i Ming) toate generate instant. Po�i deasemeanea ca rezultatul t�u s� fie orice fi�ier text, cum ar fi XHTML sau orice alte fi�iere XML. PHP poate genera autmoat aceste fi�iere �i s� le salveze �n sistemul de fi�iere �n loc s� le afi�eze, form�nd un cache de partea serverului pentru continutul t�u dinamic.

Una dintre cele mai puternice �i importante facilit��i �n PHP este suportul s�u pentru o gam� larga de baze de date. Scrierea une pagini de web ce interac�ioneaza cu o baz� de date este incredibil de simpl�. Urm�toarele baze de date sunt suportate:

Deasemenea avem o extensie abstracta a bazei de date DBX ce ��i permite �ntr-un mod transparent dolosirea oric�rei bazei de date ce suport� aceast� extensie. Mai mult, PHP suport� ODBC, standardul Open Database Connectio, deci te po�i conecta la orice alt� baz� de date ce suporta acest standard mondial.

PHP are deasemeanea suport pentru a conversa cu alte servicii folosind protocoale cum ar fi LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (pe Windows) �i multe altele. Po�i deasemenea deschide deasemenea socket-uri de re�ea �i s� interac�ionezi �ntre aproape toate limbajele de programare Web. Apropo de interconectare, PHP are suport pentru instan�ierea obiectelor Java �i utilizarea lor �ntr-un mod transparent ca obiecte PHP. Po�i deasemenea folosi extensii CORBA pentru a accesa obiecte aflate la distan��.

PHP are capabilit��i extrem de folositoare pentru procesarea textului, de la POSIX Extins sau expresii regulare Perl p�n� la parsarea documentelor XML. Pentru parsarea �i accesarea documentelor XML, suport�m standardele SAX �i DOM. Po�i folosi extensia noastra XSLT pentru a transforma documentele XML.

Folosind PHP �n domeniul comer�ului electronic, vei descoperi foarte folositoare pentru programul t�u de pla�i online func�ii de plat� Cybercash, CyberMUT, VeriSign Payflow Pro �i CCVS.

�n cele din urm�, dar nu ultimul r�nd, avem �i alte extensii interesante, cum ar fi func�ii ale motorului de c�utare mnoGoSearch, func�ii pentru accesarea IRC-ului, multe utilitare de compresie (gzip, bz2), conversie de calendar, traducere…

Similar Posts

  • Atitudini, Opinii Si Comportamente ale Clientilor Brasoveni Fata de Produsele Si Serviciile Software Oferite de Microsoft

    CUPRINS INTRODUCERE CAPITOLUL I – ASPECTE CONCEPTUALE ȘI METODOLOGICE ALE MIXULUI DE MARKETING SPECIFIC PIEȚEI PRODUSELOR ȘI SERVICIILOR SOFTWARE 1.1. Conceptul de marketing în cadrul serviciilor 1.2. Componentele mixului marketingului specifice pieței produselor și serviciilor software 1.2.1. Politica de produs în servicii 1.2.2. Politica de preț în servicii 1.2.3. Politica de plasament în servicii 1.2.4….

  • Interconectarea Aplicatiilor Office cu Baze de Date

    prezentare generala Microsoft WORD Programul Word este un program puternic si usor de utilizat. Firma Micrrosoft a testat programul Word in laboratoarele proprii pentru a gasi cai de a face caracterisicile programului mai usor accesibile; in prezent el poseda numeroase facilitati care simplifica sensibil operatii ce erau foarte complicate sau chiar imposibil de realizat. Aplicatiile…

  • Realizarea Filmelor cu Windows Xp

    CUPRINS 1. Introducere 3 2. Prezentarea programului folosit …………………………………………………………………………………3 3. Colectarea elementelor proiectului 3 4. Pregătirea clipurilor 3 5. Asamblarea clipurilor……………………………………………………………………………………………….4 6. Inserarea tranzițiilor…………………………………………………………………………………………………4 7. Aplicarea efectelor speciale……………………………………………………………………………………….4 8. Crearea titlurilor……………………………………………………………………………………………………….4 9. Utilizarea materialelor audio………………………………………………………………………………………5 10.Crearea autofilmelor………………………………………………………………………………………………..6 11. Operațiile finale……………………………………………………………………………………………………..6 12. Listă bibliografică…………………………………………………………………………………………………..7 INTRODUCERE Această lucrare oferă posibilitatea de a realiza rapid proiecte prin imagini…

  • Proiectarea Unui Sistem Integrat al Ofertelor Auto

    Sistemul din punct de vedere hardware este proiectat client / server singurul computer care necesită dotări hardware deosebite este serverul. Serverul recomandat este un Intel Xeon, 2 GB memorie RAM și HDD de 60-120GB SSD. Componenta Software: Pentru realizarea acestui proiect sa ales următoarea platformă software: Limbaj PHP; Un editor al limbajului PHP – Notepad…

  • Program Software Pentru Gestionarea Situației Studenților

    Cuprins Introducere…………………………………………….. Capitolul 1. Stabilirea specificațiilor proiectului………………………………………………………. Capitolul 2. Limbajul SQL……………………………………………………………. 2.1 Caracteristici generale ale SQL…………………………………………… 2.2 Fundamente ale limbajului SQL………………………………… 2.3 Definirea datelor…………………………………………………… 2.4 Crearea schemei unei baze de date…………………………… 2.5 Adaugarea relațiilor în baza de date……………………………… 2.6 Ștergerea relațiilor dintr-o bază de date…………………… 2.7 Optimizarea unei baze de date………………………… 2.8 Indexare………………………………………… 2.9 Restricții…

  • Utilizarea Framework Ului Hibernate Pentru Elaborarea Aplicatiilor Web

    UTILIZAREA FRAMEWORK-ULUI HIBERNATE PENTRU ELABORAREA APLICAȚIILOR WEB 526.2 TEHNOLOGII INFORMAȚIONALE Teză de licență Cuprins Introducere Tendința omenirii de a imita, reproduce, multiplica și eterniza diverse obiecte, procese și fenomene a apărut cînd ea a conștientizat locul său în lumea înconjurătoare. Odată cu dezvoltarea științei și perfecționarea mijloacelor de calcul se schimbă esențial metodele și procedeele…