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).

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(idAbonat, idTelefon)
  • 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 idApel respectiv 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(idAbonat, idTelefon)
  • Apeluri(idApel,destinatieApel, durataApel, intervalOrar)
  • TelefoaneApeluri(idTelefon, idApel)
  • TarifareApel(intervalOrar, tarifApel)

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


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
Advertisements

4 thoughts on “Exemplu normalizare MySQL

  1. Multumesc pentru informatii.
    O intrebare: in cazul este necesar un formular de introducere date in tabele, care ar fi modalitatea de realizare?
    Ma confrunt cu o baza de date care are 3 tabele cu relatii 1-n (in cascada) si nu stiu cum sa fac un formular in care se introduc o inregistrare in tabel1, N inregistrari in tabel2 si la fiecare inregistrare din tabel2, una sau mai multe inregistrari in tabel3.
    Am gasit o varianta (http://www.phpromania.net/forum/viewtopic.php?t=29223&p=153491), dar nu stiu ce functii trebuie folosite – for, while si ce variabile care sa preia datele scrise de utilizator si sa le introduca in tabelele respective, pastrand constrangerile dintre tabele.
    Ai putea face un tutorial despre asta… sau sa imi dai doar cateva indicatii?
    Multumesc.
    O zi buna.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s