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(idAnimal, idMedicIngrijitor)
  • Vaccinuri(idVaccin, numeVaccin, dozaVaccin, tarifDoza)
  • VaccinuriAnimal(idVaccin, idAnimal)

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(idAnimal, idMedicIngrijitor)
  • Vaccinuri(idVaccin, numeVaccin, dozaVaccin)
  • VaccinuriAnimal(idVaccin, idAnimal)
  • TarifareVaccinuri(dozaVaccin, tarifDoza)

 Pentru vizualizarea grafica acestei normalizari veti avea nevoie de MySQL Workbench. Pentru aceasta baza de date vom avea ceva de genul:

Untitled

Advertisements

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