Normalizare baza de date

Dupa aproape 4 ani revin asupra acestui subiect pentru ca e clar ridica probleme in randul incepatorilor ce au de a face cu bazele de date. Spun incepatori deoarece sincer, eu nu mai folosesc aceasta metoda de mormalizare lucrurile venind de la sine.

Un exemplu de normalizare il gasiti aici: exemplu normalizare baza de date abonati telefonici

Iata scenariul:

Sa se proiecteze o baza de date pentru o organizatie, avand in vedere urmatoarele constrangeri: – constrangerea de integritate a entitatii; – constrangerea de integritate referentiala; – baza de date contine cel putin 6 tabele; – baza de date contine cel putin un tabel referential (entitate referentiala transversala).

Normalizarea se va face pe baza primelor 3 forme normale. Dupa proiectare, trebuie realizata diagrama entitate-asociere utilizand aplicatia MySQL Workbench, precum si scriptul SQL care implementeaza baza de date.

Sa se implementeze o operatie de tip JOIN pe trei tabele, care sa utilizeze cel putin o functie de sumarizare si sa contina cel putin o filtrare. Sa se implememnteze o vizualizare avand la baza o operatie de tip JOIN (diferita de cea precizata la punctul anterior).

Cum gandim si ce facem de aici:
In primul rand trebuie sa plecam de la ideea centrala pentru care dorim normalizarea.

De exemplu pentru o ferma cu animale sa zicem ca vrem sa tinem minte ce vaccinari ii sunt facute unui animal dealungul vietii. Pentru asta in baza de date vom aveam nevoie de date de identificare pentru animal, date de identificare pentru vaccin, date de identificare pentru cel ce a facut vaccinul, nu?

Pasul 1

bazaAnimale(idAnimal, numeAnimal, varstaAnimal, tipAnimal, idMedicIngrijitor, numeMedicIngrijitor, telefonMedicIngrijitor, idVaccin, numeVaccin, dozaVaccin, tarifDoza)

Pasul 2

Aici incepe pur si simplu normalizarea.

Procesul de normalizare consta in “spargerea” acestei baza de date in tabele astfel incat informatia gazduita in sistem sa fie minimala. (De ce sa avem un spatiu ocupat de 2Mb cand putem avea 1.5Mb?, nu?)

  • De exemplu mai multe animale pot sa aiba acelasi ingrijitor: nu ar fi mai util ca ingrijitorul la care se face referire sa fie identificat printr-un numar? (nu vom mai avea ceva de genul: animal 1, 10 ani, porc cu ingrijitorul Popescu Ion 0700 000 000 ci vom sti ca ingrijitorul x (x – un numar) este popescu ion si astfel vom rezolva mult mai usor situatiile in care acesta sa zicem is modifica numarul de telefon.
  • Un alt exemplu similar cu cel de sus este faptul ca unui animal ii pot fi facute o serie de vaccinuri. Dintre acestea o parte ii sunt administrate si unui al animal.

Procesul de nomalizare presupune mai multe etape, etape ce face ca Bazei de date normalizate sa ii fie aplicate mai multi algorimti de “simplicare” numiti si FORME NORMALE (NORMAL FORMS).

Acestea sunt:

  • Forma normala 1 – care elimina grupurile repetitive
  • Forma normala 2 – in urma careia dependintele fata de cheia primara a tabelului sunt “totale” (vom sti cu siguranta ca elementul x din tabela T nu va fi putea fi confundat cu y).
  • Forma normala 3 – eleminarea redundantei datelor (daca intr-un tabel va trebui sa specificam pretul unui produs aferent unui anumit gramaj nu are rost sa facem acest lucru pentru fiecare element din tabel. Mai bine vom stoca pretul/gramaj intr-un alt tabel si ne vom referi la pret doar prin gramaj)

Mersul algoritmului este urmatorul:

1  Strucutra de baza

Structura de baza a bazei de date este redata de relatia de mai jos:

bazaAnimale(idAnimal, numeAnimal, varstaAnimal, tipAnimal, idMedicIngrijitor, numeMedicIngrijitor, telefonMedicIngrijitor, idVaccin, numeVaccin, dozaVaccin, tarifDoza)

2  Normalizare

Eliminarea grupurilor repetitive prin aplicarea formei normale 1 (1NF).

Prin aplicarea 1NF vom aveam urmatoarele tabele:

  • Animal(idAnimal, numeAnimal, varstaAnimal, tipAnimal)
  • MediciIngrijitori(idAnimal, idMedicIngrijitor, numeMedicIngrijitor, telefonMedicIngrijitor, idVaccin, numeVaccin, dozaVaccin, tarifDoza)

Deasemenea se observa existenta unui grup repetitiv si in cadrul relatiei Ingrijtor: pentru un medic ingrijitor putem avea mai multe vaccinuri efectuate pentru diverse animale.

Vom aplica asadar dinnou forma normala 1 (1NF) asupra relatiei MedicIngrijitor si vom obtine urmatoarele 2 tabele: MediciIngrijitori, Vaccinuri.

  • MediciIngjitori(idAnimal, idMedicIngrijitor, numeMedicIngrijitor, telefonMedicIngrijitor)
  • Vaccinuri(idAnimal, idMedicIngrijitor, numeVaccin, dozaVaccin, tarifDoza)

In urma acestei etape de normalizare deci vom obtine tabelele: Animal, MediciIngrijitori, Vaccinuri.

Observam in continuare inexistenta dependentelor totale fata de cheia primara a relatiei pentru tabelele MediciIngrijitori, Vaccinuri iar in consecinta procedam prin aplicarea 2NF. Vom obtine:

  • MediciIngjitori(idMedicIngrijitor, numeMedicIngrijitor, telefonMedicIngrijitor)
  • AnimalMedicIngrijitor(idAnimalidMedicIngrijitor)
  • Vaccinuri(idVaccin, numeVaccin, dozaVaccin, tarifDoza)
  • VaccinuriAnimal(idVaccinidAnimal)

Se observa in ca o problema in ceea ce priveste redundanta datelor si anume existenta unei relatii de tipul Many : One si anume aceea prezentata de idVaccin respectiv tarifDoza.Stim ca in functie de doza administrata avem un anumit tarif pentru vaccinul efectuat. Astfel pentru eliminarea aceste dependente tranzitive vom proceda prin aplicarea formei normal 3 (3NF):

  • Vaccinuri(idVaccin, numeVaccin, dozaVaccin) *unde dozaVaccin este cheie externa
  • TarifareVaccinuri(dozaVaccin, tarifDoza)

3  Structura finala a bazei de date

In urma pocesului de normalizare a bazei de date initiale au rezultat urmatoarele relatii(tabele) ce definesc structura bazei de date pentru managementul vaccinarilor animalelor din cadrul unei Ferme.

  • Animal(idAnimal, numeAnimal, varstaAnimal, tipAnimal)
  • MediciIngjitori(idMedicIngrijitor, numeMedicIngrijitor, telefonMedicIngrijitor)
  • AnimalMedicIngrijitor(idAnimalidMedicIngrijitor)
  • Vaccinuri(idVaccin, numeVaccin, dozaVaccin)
  • VaccinuriAnimal(idVaccinidAnimal)
  • TarifareVaccinuri(dozaVaccin, tarifDoza)

Exemplu normalizare baza de date

Iata cum suna o tema de aplicatie primita in cadrul un proiect la scoala.

Tema aplicatie: Factura telefonica 

Sa se proiecteze o baza de date pentru un furnizor de servicii telefonice, avand in vedere urmatoarele constrangeri:

  • constrangerea de integritate a entitatii
  • constrangerea de integritate referentiala
  • furnizorul are mai multi abonati
  • fiecare abonat poate detine unul sau mai multe numere de telefon
  • de pe fiecare numar de telefon se pot efectua mai multe apeluri telefonice
  • apelul telefonic se taxeaza in functie ora la care a fost efectuat

Normalizarea se va face pe baza primelor 3 forme normale.

Dupa proiectare, trebuie realizata schema bazei de date, utilizand aplicatia MySQL Workbench, precum si scriptul SQL care implementeaza baza de date.

Sa se dezvolte o aplicatie Web care sa permita introducerea de inregistrari in tabelele bazei de date (datele sunt preluate de la utilizatori folosind formulare Web).

Sa se afiseze tabelar toti clientii, precizand ultima factura pentru fiecare numar de telefon (se utilizeaza operatii de tip JOIN).

In cele ce urmeaza puteti vedea metoda aleasa pentru implementarea atat a bazei de date cat si a plicatiei web. Aplicatia web sper sa v-o pot prezenta intr-un articol viitor caci nu vreau sa ma extind prea mult acum si in plus sunt alte probleme ce “cred” ca le voi intampina in a v-o prezenta.

1.      Proiectarea bazei de date

1.1  Strucutra de baza

Structura de baza a bazei de date este redata de relatia de mai jos:

bazaAbonati(idAbonat, numeAbonat, prenumeAbonat, adresaAbonat, idTelefon, nrTelefon, idApel, destinatieApel, durataApel, intervalOrar, tarifApel)

1.2  Normalizare

Eliminarea grupurilor repetitive prin aplicarea formei normale 1 (1NF).

Prin aplicarea 1NF vom aveam urmatoarele tabele:

  • Abonat(idAbonat, numeAbonat, prenumeAbonat, adresaAbonat)
  • Telefoane(idAbonat, idTelefon, nrTelefon, idApel, destinatieApel, durataApel, intervalOrar, tarifApel)

Deasemenea se observa existenta unui grup repetitiv si in cadrul relatiei Telefoane: pentru un numar de telefon putem avea mai multe apeluri efectuate catre diverse destianatii.

Vom aplica asadar dinnou forma normala 1 (1NF) asupra relatiei Telefoane si vom obtine urmatoarele 2 tabele: Telefoane, Apeluri.

  • Telefoane(idAbonat, idTelefon, nrTelefon)
  • Apeluri(idTelefon, idApel, destinatieApel, durataApel)

In urma acestei etape de normalizare deci vom obtine tabelele: Abonat, Telefoane, Apeluri.

Observam in continuare inexistenta dependentelor totale fata de cheia primara a relatiei pentru tabelele Telefoane, Apeluri iar in consecinta procedam prin aplicarea 2NF. Vom obtine:

  • Telefoane(idTelefon, nrTelefon)
  • AbonatTelefoane(idAbonatidTelefon)
  • Apeluri(idApel,destinatieApel, durataApel, intervalOrar, tarifApel)
  • TelefoaneApeluri(idTelefon, idApel)

Se observa in ca o problema in ceea ce priveste redundanta datelor si anume existenta unei relatii de tipul Many : One si anume aceea prezentata de idApelrespectiv intervalOrar.Stim ca in functie de intervalul orar avem un anumit tarif pentru apelul efectuat. Astfel pentru eliminarea aceste dependente tranzitive vom proceda prin aplicarea formei normal 3 (3NF):

  • Apeluri(idApel, destinatieApel, durataApel, intervalOrar) *unde intervalOrar este cheie externa
  • TarifareApel(intervalOrar, tarifApel)

1.3  Structura finala a bazei de date

In urma pocesului de normalizare a bazei de date initiale au rezultat urmatoarele relatii(tabele) ce definesc structura bazei de date pentru managementul Facturilor telefonice pentru abonati unui furnizor

  • Abonat(idAbonat, numeAbonat, prenumeAbonat, adresaAbonat)
  • Telefoane(idTelefon, nrTelefon)
  • AbonatTelefoane(idAbonatidTelefon)
  • Apeluri(idApel,destinatieApel, durataApel, intervalOrar)
  • TelefoaneApeluri(idTelefon, idApel)
  • TarifareApel(intervalOrar, tarifApel)

diagrama-normalizare

Figură 1. Implementare MySQL Workbench

Obs: Avem nevoie de tabelul AbonatTelefoane in ideea existentei unei posibilitati ca furnizorul sa redistribuie numere de telefon altor abonati, numere de telefon ce devin libere in eventualitatea rezilierii contractelor cu anumiti abonati.

 2.       Proiectarea aplicatiei WEB

Pentru proiectarea amplicatie ce permite operarea cu baza de date creata vor fi folosite ca si limbaje de programare urmatoarele:

  • HTML – pentru crearea interfetei cu utilizatorul
  • PHP – pentru managementul continutului dinamic
  • CSS – pentru implentarea stilului paginii

2.1. Structura aplicatiei WEB

structura_web_aplicatie

2.2. Pagini aplicatie

“Scriptul php” este constituit din urmatoare pagini ce pot fi identificate si in structura descrisa mai sus. Mai concret putem vorbi despre urmatoarele pagini:

  • Index.php – este pagina de start a aplicatiei. Dupa cum bine stim orice server apache atunci cand nu are specificat in configuratie ca alta pagina de start un alt nume are in configuratia sa ca pagina „default” index.php. Astfel o aplicatie, un script php este rulat in totdeauna incepand cu pagina index.php , aceasta putand fi considerata echivalentul functiei „main” in libajul C.
  • Abonati.php  – aceasta pagina permite afisarea tutoror abonatilor dar si afisarea informatiilor cu privire la un abonat specificat printr-o metoda GET.
  • Factura.php – permite afisarea informatiilor cu privire la apelurile efectuate de la un numar de telefon. Dar totodata prin intermediul paginii de facturare se genereaza o factura unde avem specificat costul total al apelurilor efectuate de la numarul respectiv de telefon.
  • Adauga.php – pagina ce permite adaugare informatiilor cu privire la un abonat dar si asignarea unui numar de telefon abonatului respectiv.
  • Editeaza.php – la fel ca si in cazul pagini adauga si pagina de editare permite modificare acelorasi informatii specificate mai sus

Cum sa normalizezi o baza de date

Dupa aproape 4 ani revin asupra acestui subiect pentru ca e clar ridica probleme in randul incepatorilor ce au de a face cu bazele de date. Spun incepatori deoarece sincer, eu nu mai folosesc aceasta metoda de mormalizare lucrurile venind de la sine.

Un exemplu de normalizare il gasiti aici: exemplu normalizare baza de date abonati telefonici

Iata scenariul:

Sa se proiecteze o baza de date pentru o organizatie, avand in vedere urmatoarele constrangeri: – constrangerea de integritate a entitatii; – constrangerea de integritate referentiala; – baza de date contine cel putin 6 tabele; – baza de date contine cel putin un tabel referential (entitate referentiala transversala).

Normalizarea se va face pe baza primelor 3 forme normale. Dupa proiectare, trebuie realizata diagrama entitate-asociere utilizand aplicatia MySQL Workbench, precum si scriptul SQL care implementeaza baza de date.

Sa se implementeze o operatie de tip JOIN pe trei tabele, care sa utilizeze cel putin o functie de sumarizare si sa contina cel putin o filtrare. Sa se implememnteze o vizualizare avand la baza o operatie de tip JOIN (diferita de cea precizata la punctul anterior).

Cum gandim si ce facem de aici:
In primul rand trebuie sa plecam de la ideea centrala pentru care dorim normalizarea.

De exemplu pentru o ferma cu animale sa zicem ca vrem sa tinem minte ce vaccinari ii sunt facute unui animal dealungul vietii. Pentru asta in baza de date vom aveam nevoie de date de identificare pentru animal, date de identificare pentru vaccin, date de identificare pentru cel ce a facut vaccinul, nu?

Pasul 1

bazaAnimale(idAnimal, numeAnimal, varstaAnimal, tipAnimal, idMedicIngrijitor, numeMedicIngrijitor, telefonMedicIngrijitor, idVaccin, numeVaccin, dozaVaccin, tarifDoza)

Pasul 2

Aici incepe pur si simplu normalizarea.

Procesul de normalizare consta in “spargerea” acestei baza de date in tabele astfel incat informatia gazduita in sistem sa fie minimala. (De ce sa avem un spatiu ocupat de 2Mb cand putem avea 1.5Mb?, nu?)

  • De exemplu mai multe animale pot sa aiba acelasi ingrijitor: nu ar fi mai util ca ingrijitorul la care se face referire sa fie identificat printr-un numar? (nu vom mai avea ceva de genul: animal 1, 10 ani, porc cu ingrijitorul Popescu Ion 0700 000 000 ci vom sti ca ingrijitorul x (x – un numar) este popescu ion si astfel vom rezolva mult mai usor situatiile in care acesta sa zicem is modifica numarul de telefon.
  • Un alt exemplu similar cu cel de sus este faptul ca unui animal ii pot fi facute o serie de vaccinuri. Dintre acestea o parte ii sunt administrate si unui al animal.

Procesul de nomalizare presupune mai multe etape, etape ce face ca Bazei de date normalizate sa ii fie aplicate mai multi algorimti de “simplicare” numiti si FORME NORMALE (NORMAL FORMS).

Continue…

Functii PHP

Am aflat si eu acu nu demult, dar totusi destul de tarziu ca o functie php chiar daca nu are in corpul sau comanda sau sintaxa return aceasta returneaza tot timpul o valoare un element , returneaza ceva”.

Am inceput prin a specifica acest lucru pentru a invata voi macar din greselile mele. Iar acum ca am stabilit un punct de plecare sa-i dam drumul si astfel sa discutam despre niste functii in limbajul PHP. Pentru incepul vreau sa va prezint un scurt desfasurator al punctelor de discutie pentru a va ghida mai usor in cadrul articolului:

  • Ce sunt functiile PHP (ce consideram o functie)
  • Sintaxa declararii unei functii
  • imbinare HTML+PHP in realizarea unui script PHP
  • Utilitatea functiilor
  • Concluzii generale
Acestea fiind spuse sa incep si detalierea ar fi o idee.
  • Ce sunt functiile PHP
Functia este o secventa de cod ce poate fi utilizata de mai multe ori in interiorul marilor scripturi si este prezentata in script prin declaratia ei.
Functia chemata (invocata) va contine acelasi numar de argumente ca in declaratie.
In PHP4 o functie poate fi definita oriunde in cadrul script-ului si in interiorul unei functii poate sa apara orice secventa valida de cod care include definirea de alte functii si definitii de clase. Argumentele unei functii trebuie separate prin virgula, si, implicit, acestea sunt transmise prin valoare. Pentru ca functia sa returneze un rezultat se foloseste constructia return care primeste ca parametru o expresie care reprezinta valoarea functiei. In momentul in care este intalnita constructia return, executia functiei se incheie. In exemplul urmator se calculeaza cu ajutorul unei functii PHP, patratul unui numar. Continue…

Exemplu normalizare MySQL

Iata cum suna o tema de aplicatie primita in cadrul un proiect la scoala.

Tema aplicatie: Factura telefonica 

Sa se proiecteze o baza de date pentru un furnizor de servicii telefonice, avand in vedere urmatoarele constrangeri:

  • constrangerea de integritate a entitatii
  • constrangerea de integritate referentiala
  • furnizorul are mai multi abonati
  • fiecare abonat poate detine unul sau mai multe numere de telefon
  • de pe fiecare numar de telefon se pot efectua mai multe apeluri telefonice
  • apelul telefonic se taxeaza in functie ora la care a fost efectuat

Normalizarea se va face pe baza primelor 3 forme normale.

Dupa proiectare, trebuie realizata schema bazei de date, utilizand aplicatia MySQL Workbench, precum si scriptul SQL care implementeaza baza de date.

Sa se dezvolte o aplicatie Web care sa permita introducerea de inregistrari in tabelele bazei de date (datele sunt preluate de la utilizatori folosind formulare Web).

Sa se afiseze tabelar toti clientii, precizand ultima factura pentru fiecare numar de telefon (se utilizeaza operatii de tip JOIN).

In cele ce urmeaza puteti vedea metoda aleasa pentru implementarea atat a bazei de date cat si a plicatiei web. Aplicatia web sper sa v-o pot prezenta intr-un articol viitor caci nu vreau sa ma extind prea mult acum si in plus sunt alte probleme ce “cred” ca le voi intampina in a v-o prezenta.

1.      Proiectarea bazei de date

1.1  Strucutra de baza

Structura de baza a bazei de date este redata de relatia de mai jos:

bazaAbonati(idAbonat, numeAbonat, prenumeAbonat, adresaAbonat, idTelefon, nrTelefon, idApel, destinatieApel, durataApel, intervalOrar, tarifApel)

1.2  Normalizare

Eliminarea grupurilor repetitive prin aplicarea formei normale 1 (1NF). Continue…

Constrangeri in realizarea unei baze de date MySQL

Pana nu demult si eu pot sa spun ca atunci cand realizam o baza de date lucram dupa ureche. Daca mi se parea ca ceva nu e cum ar trebui modificam dupa propriul gust si simt cu increderea suficienta ca voi obtine ce doresc.Un mod ciobanesc de a face treaba, dar am reusit sa o fac si asa. Asa ca am sa incadrez aceasta etapa a proiectarii in categoria  “Asa am procedat.

Sa stiti ca facultatea este buna la ceva mai ales cand ce alegi in sa faci in cadrul cursurilor optionale consideri cu tarie ca iti va fi de folos pe viitor, si nu te indrepti cu scarba catre sala de curs sau de laborator cu gandul “ce vrea boul asta de la noi?” sau “cu ce prostii incearca sa ne impresioneze azi?”.

Avand in vedere ca domeniul de programare web e in tot mai mare crestere, cerintele pentru oameni care sunt atrasi de acest domeniu sunt tot mai ridicate nu am ramas pasiv la acest lucru si stiind ca o materie care poate sa imi descreteasca putin fruntea ar fi “B(aze de) D(ate)” am ales-o fara nici un moment de framantare azi vara ca materie optionala in acest an. Zis si in continua facere pana in saptamana 14. Continue…