Sunteți pe pagina 1din 12

9. Baze de date. MySQL.

9.1 Introducere
9.2 SQL i MySQL
9.3 Clienti MySQL
9.4 Crearea unei baze de date. Organizarea informaiei n tabele
9.5 Structura (design-ul) unei baze de date
9.1 Introducere
O baz de date este o colecie de nregistrri sau de informaii
introduse i stocate ntr-un calculator ntr-un mod sistematic (structurat).
O baz de date poate fi interogat (ntrebat) de ctre noi sau de ctre un
program prin intermediul unui limbaj relativ simplu (n general SQL) i
rspunde cu informaie, n funcie de care se iau decizii. Pentru
valorificarea informaiei ce poate fi extrasa dintr-o baza de date, este
esenial modul n care organizm i stocam datele intr-o baz de date.
Aplicaii ale bazelor de date pe Web
Orice site care are un modul de login sau nregistrare utilizatori,
orice magazin virtual, catalog de produse, forum, sistem de newsletter,
articole, tiri, etc. are n mod sigur o baza de date n care este inut
informaia n mod structurat. Cea mai mare parte a site-urilor de pe
Internet care trec de nivelul de site de prezentare, i vnd produse,
servicii sau coninut informaional (cursuri, articole) ctre utilizatorii
site-ului folosesc baze de date.
Aplicaii ale bazelor de date in alte domenii
O marte parte din aplicaiile software existente folosesc baze de
date pentru stocarea i extragerea informaiilor. Date de identificare,
istoria plilor la telefonia mobila, electricitate, etc. sunt inute n mod
structurat n bazele de date ale furnizorilor de servicii. n Statele Unite,
informaiile medicale, istoria creditelor, istoria angajrilor, precum i
alte informaii aparinnd unei persoane, se pot obine de instituiile
guvernamentale, pe baza numrului de asigurare social al persoanei
respective (SSN - social security number). Recensmntul, rezultatele la
vot, plus alte informaii sociale, sunt inute n baze de date. Aceste baze
de date se interogheaz ulterior pentru obinerea de diverse statistici.
DBMS - Database Management System
Aplicaia care este folosit pentru a realiza, a administra i a
interoga o baz de date este numit sistemul de management al bazei de
date (DBMS - Database Management System).

186

Modelul unei baze de date este o specificaie tehnic acceptat


de mai muli furnizori de programe de baze de date (DBMS) ce se refer
la modul n care sunt stocate informaiile n baza de date i modul n
care sunt folosite. Exemple de modele sunt: modelul relaional,
modelul orientat-obiect, modelul ierarhic, etc. Cel mai rspndit n
prezent este modelul relaional. Bazele de date relaionale au
informaiile organizate n tabele, iar ntre informaiile din aceste tabele
pot fi stabilite legturi. Primele sisteme de baze de date relaionale au
aprut n 1970. Cele mai populare DBMS relaionale sunt: Oracle,
Microsoft SQL Server, MySQL. Toate aceste sisteme de baze de date
relaionale au n comun limbajul standard de interogare a bazei de date
numit SQL.
9.2 SQL i MySQL
SQL - Structured Query Language este un limbaj de baze de
date realizat pentru a extrage informaii i a administra bazele de date
relaionale. Limbajul SQL a devenit standard ANSI (American National
Standards Institute) n 1986.
Fiecare sistem de management al bazei de date (RDBMS Relational Database Management System) comercial are propria
versiune de limbaj SQL, bazat pe standardul SQL.
Astfel, limbajul SQL folosit n MySQL, fat de limbajul SQL
folosit n PostgreSQL sau Oracle, dei asemntoare, au elemente
distincte, specifice acelui RDBMS.
MySQL este o aplicaie comercial pentru managementul bazelor
de date relaionale (pe scurt un RDBMS) foarte popular, mai ales n
dezvoltarea aplicaiilor web. MySQL este dezvoltat de firma suedez
MySQL AB ce a fost ntre timp cumprata de Sun Microsystems.
Echipele ce au dezvoltat limbajul PHP i baza de date MySQL au
colaborat cu succes de-a lungul timpului pentru a oferi o
interoperabilitate ridicat ntre cele dou programe, astfel nct prima
preferin a programatorilor dezvoltatori n PHP pentru baze de date este
MySQL. n plus, PHP are extensii (set de funcii) pentru a lucra i cu
alte baze de date: PostgreSQL, Oracle, SQL Server, etc.
9.3 Clieni MySQL
Sistemele de baze de date sunt concepute ntr-o arhitectura clientserver. Astfel, serverul de baze de date este programul principal ce
stocheaz i manipuleaz datele, i rspunde clienilor (programe de tip

187

client) ce se conecteaz la acesta pentru a cere informaii sau pentru a


trimite cereri de alt natur (adugri, modificri, etc).
Serverul MySQL i clientul MySQL folosit pentru interogare
pot fi instalate pe acelai calculator, dar nu neaprat. Dac lucrm local
(pe calculatorul propriu) i folosim un program ca WAMP server, att
serverul MySQL ct i clientul MySQL pe care-l alegem, vor fi
instalate pe calculatorul nostru. n momentul cnd mutm baza de date
pe un server de web hosting, serverul MySQL va fi pe acel server de
web hosting iar clientul MySQL poate fi tot pe acel server (de exemplu
phpMyAdmin) sau ne putem conecta cu un client MySQL instalat pe
calculatorul nostru (phpMyAdmin, MySQL Query Browser).
Pentru a administra o baza de date MySQL, un programator
developer are n general urmatoarele optiuni:
1. phpMyAdmin este unul dintre cei mai folosii clieni MySQL. Este
disponibil n interfaa web (web-based), uor de folosit, i instalat
implicit pe marea majoritate a serverelor de gzduire. Astfel, un
programator web ce a instalat aplicaia WAMP Server (vezi anexa
Instalare si configurare WAMP) pe calculatorul local, are automat
instalat i phpMyAdmin.

2. Executabilul mysql este un client fr interfa grafic, folosit


din linia de comand. Aceast variant de administrare i folosire
a MySQL este folosit mai puin de dezvoltatorii web ins sunt
unele cazuri cnd se dovedete superioar celorlalte variante.
Pentru a executa mysql din linia de comanda vom parcurge
urmtorii pai:

188

Mergei n Start -> Run, tastai cmd apoi Enter


Aici, dac tastai mysql i nu este recunoscut comanda
trebuie s continuai cu paii urmtori, s adugai folderul
n care se afl binarul mysql n variabila Path
Mergei n Control Panel -> System -> Advanced ->
Environment Variables -> System Variables, click Path
-> Edit ;i adugai calea ctre folderul respectiv, la
"Variable value", folosind punct i virgula naintea ei
astfel: ;c:\wamp\bin\mysql\mysql5.0.51b\bin
Redeschidei un terminal (linie de comand) i ar trebui
cnd tastai mysql s intrai n linia de comand mysql ca
n printscreen-ul urmtor

Pentru a avea drepturi depline, v puteti conecta cu root,


folosind sintaxa: mysql -u root -p

3. MySQL GUI Tools este o suit compus din 3 aplicaii cu interfaa


grafic (ce se instaleaz pe calculatorul local) pentru administrarea
MySQL. Cele 3 aplicaii sunt: MySQL Administrator , MySQL
Query Browser, MySQL Migration Toolkit.

189

9.4 Crearea unei baze de date. Organizarea informaiei n tabele


Urmrind un exemplu simplu, vom vedea cum este organizat
informaia n MySQL (sau n alte baze de date relaionale).
Baza de date - serverul MySQL conine mai multe baze de
date. n funcie de privilegiile cu care clientul MySQL se conecteaz la
server, pot avea acces la toate bazele de date sau doar la o parte din ele.
De cele mai multe ori o aplicaie (web) folosete o singur baz de date
la care se conecteaz pentru a actualiza sau extrage informaii.
Aplicaiile mai complexe pot folosi mai multe baze de date la care se
conecteaz simultan sau pe rnd.
Folosind phpMyAdmin, o baz de date (goal, far tabele) se
creeaz simplu, scriind numele bazei de date n cmpul "Create new
database" i apsnd butonul "Create". Baza de date pe care o realizm
n acest exemplu se numete "mybank".

190

Tabelul - o baz de date este compus din mai multe tabele.


ntr-o aplicaie pot avea cte un tabel pentru: utilizatori, produse,
categorii de produse, ncasri, etc. Dac avem 100 de utilizatori, vom
avea 100 de nregistrri (rnduri) n tabelul utilizatori. Nu vom intra n
detalii deocamdat referitor la sintaxa sql de creare a unui tabel sau la
posibilitile interfeei phpMyAdmin.
Pentru realizarea celor dou tabele ale acestei baze de date, vom
alege baza de date "mybank", apsnd pe linkul (butonul) SQL din
meniul de mai sus, i executnd urmtorul codul sql:
--- Table structure for table `utilizatori`
-

DROP TABLE IF EXISTS `utilizatori`;


CREATE TABLE `utilizatori` (
`utilizatorId` int(11) unsigned NOT NULL auto_increment,
`username` varchar(20) NOT NULL,
`email` varchar(25) NOT NULL,
`anNastere` smallint(4) unsigned default NULL,
`sex` enum('m','f') NOT NULL,

191

`dataAdaugarii` date NOT NULL,


PRIMARY KEY (`utilizatorId`),
UNIQUE KEY `username` (`username`),
KEY `email` (`email`)
);
--- Dumping data for table `utilizatori`
---- Table structure for table `mesaje`
-DROP TABLE IF EXISTS `mesaje`;
CREATE TABLE `mesaje` (
`mesajId` int(11) unsigned NOT NULL auto_increment,
`utilizatorId` int(11) unsigned NOT NULL,
`subiect` varchar(255) NOT NULL default 'fara subiect',
`mesaj` text NOT NULL,
`dataMesaj` datetime NOT NULL,
PRIMARY KEY (`mesajId`)
);
--- Dumping data for table `mesaje`
-Aceste instruciuni sql vor realiza dou tabele n baza de date
mybank, numite utilizatori si mesaje i introducem cteva rnduri n
fiecare din aceste tabele.
--- Dumping data for table `utilizatori`
-INSERT INTO `utilizatori` (`utilizatorId`, `username`, `email`,
`anNastere`, `sex`, `dataAct`) VALUES (1, 'horia', 'horia@gmail.com',
1981, 'm', '2009-04-22');
INSERT INTO `utilizatori` (`utilizatorId`, `username`, `email`,
`anNastere`, `sex`, `dataAct`) VALUES (2, 'luca', 'luca@gmail.com',
1978, 'f', '2009-04-23');

192

INSERT INTO `utilizatori` (`utilizatorId`, `username`, `email`,


`anNastere`, `sex`, `dataAct`) VALUES (3, 'noni', 'noni@yahoo.com',
1969, 'm', '2008-09-01');
--- Dumping data for table `mesaje`
-INSERT INTO `mesaje` (`mesajId`, `utilizatorId`, `subiect`,
`mesaj`, `dataMes`) VALUES (1, 1, 'salut', 'Bine-ati venit pe forum !',
'2009-04-25 15:00:18');
INSERT INTO `mesaje` (`mesajId`, `utilizatorId`, `subiect`,
`mesaj`, `dataMes`) VALUES (2, 2, 'salut si aici', 'Salut,.', '2009-0426 15:01:21');
INSERT INTO `mesaje` (`mesajId`, `utilizatorId`, `subiect`,
`mesaj`, `dataMes`) VALUES (3, 3, 'ntrebare?', 'despre ce se ..?', '200904-27 00:02:20');
INSERT INTO `mesaje` (`mesajId`, `utilizatorId`, `subiect`,
`mesaj`, `dataMes`) VALUES (4, 1, 'despre...', 'despre baze de date',
'2009-04-27 09:02:20');
INSERT INTO `mesaje` (`mesajId`, `utilizatorId`, `subiect`,
`mesaj`, `dataMes`) VALUES (5, 1, 'ceva', 'despre mysql...', '2009-04-27
09:05:20');

193

Rndurile i coloanele.

Un tabel al unei baze de date relaionale, are rnduri i coloane.


Avnd n phpMyAdmin baza de date mybank selectm, pentru a vedea
nregistrrile (informaiile) din tabelul utilizatori, dnd click pe iconia
din stnga tabelului n lista de tabele, sau pe linkul (butonul) Browse
din meniul de sus. Apsnd linkul Structure din meniu, putem vedea
coloanele sau structura tabelului respectiv, precum i tipul de date i
atributele fiecrei coloane n parte.
nregistrrile (sau rndurile) dintr-un tabel al unei baze de date
relaionale reprezint o colecie de date pentru o anumita categorie de
entiti. De exemplu, un tabel numit persoane poate ine mai multe
nregistrri, cte una pentru o persoana. Un tabel numit produse va avea
o nregistrare pentru fiecare produs. Fiecare din aceste nregistrri are
acelai set de atribute (coloanele tabelului), aceste atribute desemnnd
structura tabelului. Astfel, nregistrrile (rndurile) unui tabel
nseamn informaii, iar atributele (coloanele) unui tabel (sau unei
nregistrri) nseamn meta -informaie sau structura informaiei.
n tabelul utilizatori avem atributul (coloana) utilizator de tipul
varchar(20). Asta nseamn c pentru fiecare nregistrare trebuie s am
o informaie pentru acest atribut, informaie ce va desemna numele de
utilizator, de tip sir de caractere, ce va avea maxim 20 de caractere.
Intersecia dintre o coloana i un rnd l numim cmpul unei
nregistrri. Exemplu, cmpul username al primei nregistrri este:
"horia".
Structura (descrierea atributelor) tabelului utilizatoriin phpMyAdmin

194

9.5 Structura (design-ul) unei baze de date


query - instruciune sql
insert - instruciune sql sau operaie ce desemneaz adugarea

unei nregistrri intr-un tabel


update - instruciune sql sau operaie ce desemneaz
actualizarea unei nregistrri intr-un tabel
delete - instruciune sql sau operaie ce desemneaz tergerea
unei nregistrri ntr-un tabel
Structura (design-ul) unei baze de date relaionale const n
organizarea informaiilor n tabele astfel nct informaiile s poat fi
extrase, s nu existe redundana informaiilor (sau s fie foarte mic), s
nu existe aa-numitele anomalii de introducere, actualizare sau tergere
a nregistrrilor. Acest proces, de optimizare sistematic a structuri unei
baze de date, a fost studiat si documentat de-a lungul timpului, i
denumit normalizare (sau database normalization).
Normalizarea unei baze de date nseamn "spargerea"
informaiilor n tabele astfel nct datele s fie uor de extras prin
interogri (query) i s se evite redundana i anomaliile operaiilor de
introducere nregistrri (insert), actualizare (update) i tergere (delete).
Vom ilustra acest concept ntr-un exemplu simplu, folosind baza
de date mybank.
Considerm organizarea informaiilor ntr-un singur tabel
Teoretic, ar fi posibil s organizm informaiile unor baze de date
relaionale ntr-un singur tabel.
Informaia in acest caz este nenormalizat, i n folosirea ei n
practic ntr-o baz de date relaional apar urmtoarele probleme:
Probleme de logica i extragere a informaiei. Este ilogic s
avem informaiile a dou entiti distincte (utilizator i mesaj) ntr-un
singur mesaj. Nu putem de exemplu numra printr-o interogare simpl
utilizatorii nscrii, pentru c numrul de rnduri din acest tabel indic
de fapt numrul de mesaje. Nu pot realiza printr-o interogare simpl
media vrstei utilizatorilor acestui forum. etc.
Probleme de redundan (duplicare a informaiei).
Duplicarea informaiei genereaz nu doar anomaliile de mai jos i
alte probleme de logic, ci i probleme de spaiu de stocare pentru
aceast baz de date. Un site de succes ce gzduiete un forum cu mii de
utilizatori i sute de mii de mesaje ar ocupa spaiu n plus. Pentru fiecare

195

mesaj trimis, se stocheaz n baza de date i toate datele utilizatorului


respectiv. Spaiul necesar stocrii acestei baze de date ar fi mult mai
mare dect n mod normal, i orice operaii asupra bazei de date ar fi
mult mai incete.
Anomalie de update - de fiecare dat cnd utilizatorul horia
scrie un mesaj, i scriem toate datele din nou, e posibil s greim datele
lui la un moment dat. Astfel, baza de date devine inconsistent, adic
unele rnduri arat anumite informaii despre acest utilizator, alte
rnduri arat informaii greite. Dac dorim s actualizm o informaie
legat de un utilizator, s presupunem c horia i schimb emailul,
trebuie s cutm n acest tabel toate apariiile lui horia i s facem
actualizarea n mai multe locuri.
Anomalie de insert - avem poate utilizatori ce nu vor s scrie
nici un mesaj, i atunci nu putem ine datele despre ei pentru c nu au
scris nici un mesaj iar acest tabel aa cum e compus cere i datele unui
mesaj. Am putea s adugam un rnd cu datele utilizatorului i cu date
goale pentru mesaj dar atunci am avea alte probleme (de aplicaie) cum
ar fi de exemplu prezena pe forum a unui mesaj gol (fr subiect, fr
text, etc).
Anomalie de delete - dac tergem toate mesajele lui horia,
pierdem automat i informaia acestui utilizator
Normalizarea bazei de date - "spargerea" informaiei n mai
multe tabele.
Avnd problemele de mai sus, ideal ar fi s organizm informaia
n dou tabele: utilizatori i mesaje. Fiecrui tabel i-am adugat o
coloana de tip ntreg, ce identific n mod unic rndul respectiv prin
atribuirea unui numr. De atribuirea i pstrarea unicitii acestui numr
se ocup serverul MySQL prin setarea atributului AUTO_INCREMENT pentru aceast coloan. Pentru tabelul mesaje acea coloan este
mesajId, iar pentru utilizatori este utilizatorId. ntr-o baz de date
relaionala, este foarte indicat (chiar obligatoriu in practica) s existe o
astfel de coloana care s nu aib valori nule i s nu aib valori ce se
repeta deci s determine n mod unic o nregistrare. Aceast coloana se
numete cheie primara (sau primary key sau PK). Ea nu trebuie
neaprat s fie de tip ntreg, dei n general aa se obinuiete.
Observm c fiecare utilizator are un id (un numr unic). n
tabelul mesaje, pentru a ti ce utilizator a postat un anume mesaj, trebuie
s adugam o coloana n care s inem valoarea id-ului unui utilizator,
astfel nct s facem legtura logic cu tabelul de utilizatori. n acest fel,

196

toate mesajele trimise de horia, vor avea n dreptul coloanei utilizatorId


valoarea 1, id-ul corespunztor acestui utilizator. Aceast coloan se
numete cheie strin (sau foreign key sau FK) i indica prezena n alt
tabel a valorilor unei coloane ce e cheie primar ntr-un tabel iniial.

197