
Tutorial SQL. Baze de date (partea III-a). Normalizarea
Etichete: Baze de date, SQL
Continuarea exemplului din prima parte
Exemplul început în prima parte arată cum datele pot fi afectate de redundanţă sau inconsistenţă. Corectarea problemei presupune realizarea unei structuri în care datele să fie accesibile oriunde este nevoie prin relaţii nu prin duplicare.
În a doua parte a seriei sunt prezentate regulile care trebuie respectate pentru evitarea acestor probleme.
Pentru a rezolva problema datele vor fi separate în două tabele.
Principiul care stă la baza acestei separări şi care a fost încălcat în varianta 1 spune că două entităţi diferite trebuie separate în tabele diferite. În cazul nostru cele două entităţi sunt: produsul şi tranzacţia (prin tranzacţie înţelegând o operaţie de cumpărare). Se poate observa că un produs poate fi tranzacţionat de mai multe ori.
Prin urmare, vom crea două tabele, pentru fiecare entitate câte unul şi vom crea o legătură (relaţie) între ele. Cele două tabele vor fi: Produse şi Tranzacţii.
Paşii sunt următorii (din nou, presupunem că se foloseşte Microsoft Access):
1. Creăm, o nouă bază de date (Blank database...) pe care o numim varianta1.mdb.
2. Creăm un tabel, folosind opţiunea Create table in Design View.
3. În acest tabel creăm următoarele câmpuri:
Denumire câmp | Tip de dată |
DenumireProdus | Text(50) |
4. Salvăm tabelul cu numele Produse.
5. Deocamdată, la întrebarea „Do you want to create a primary key now?” vom răspunde cu „No”.
6. Schimbăm în modul de afişare View.
7. Introducem următoarele înregistrări:
DenumireProdus |
Camasa |
Mere |
8. Creăm un nou tabel, folosind opţiunea Create table in Design View. Denumirea tabelului va fi Tranzacţii.
9. În acest tabel creăm următoarele câmpuri:
Denumire câmp | Tip de dată |
Produs | Text(50) |
Pret | Currency |
Cantitate | Number |
Data | Date/Time |
10. În acest moment, dacă încercăm să mai introducem încă o dată înregistrarea „Camasa” în tabelul Produse, putem observa că acest lucru este perfect posibil. Asta înseamnă ni se acceptă fără probleme introducerea a două înregistrări identice (iarăşi un scenariu greşit, v-aţi prins!).
11. Încercăm să creăm o relaţie între cele două tabele. În fereastra Relationships (butonul

Acum Microsoft Access sesizează că în tabela Produse pot exista înregistrări identice şi întoarce un mesaj de eroare.
12. Pentru a putea crea o relaţie care să garanteze integritatea datelor este nevoie să revenim la tabela Produse, în modul Design.
13. Selectăm coloana DenumireProdus şi apăsăm butonul

14. Revenim în tabela Produse, în modul View şi ştergem ultima înregistrare introdusă. Refacem pasul al 11-lea, de data aceasta, cu succes. (Dacă după aceasta vom încerca să mai introducem înregistrări duplicate vom primi un mesaj de eroare.) Tabela are acum o cheie primară.
15. Acum, între cele două tabele vom crea o relaţie (cu drag-and-drop tragem peste câmpul Produs din tabela Tranzactii. Bifăm Enforce Referential Integrity şi apăsăm butonul Create):

16. Pentru a vedea efectele noii relaţii, vom încerca să introducem în tabela Tranzactii o înregistrare greşită (vom scrie „Cămşă” în loc de „Camasa”):
Produs | Pret | Cantitate | Data |
Cămşă | $100.00 | 1 | 2/22/2006 |
Microsoft Access va sesiza că nu există o înregistrare corespunzătoare în tabela Produse şi va întoarce un mesaj de eroare care ne avertizează că este necesară o înregistrare corespunzătoare în tabela Produse. Dacă vom corecta cuvântul „Camasa”, înregistrarea va fi salvată în baza de date fără probleme.
Important! În acest exemplu se poate vedea modul în care datele din tabela „copil” (Tranzacţii) sunt protejate la erori, astfel încât să nu se poată introduce produse care nu sunt definite în tabela „părinte” (Produse). Această protecţie a tabelei „copil” se numeşte integritate referenţială. Practic, existenţa ei face ca în tabela „copil” să nu poată exista înregistrări „orfane”.
17. Pentru a corecta structura bazei de date vom crea o cheie primară şi în tabela Tranzacţii. Pentru aceasta vom crea câmpul CodTranzactie de tip AutoNumber pe care îl vom defini drept cheie primară (las dumneavoastră plăcerea de a vă descurca singuri cu acest lucru!).
18. După aceasta creăm un nou query, cu structura de mai jos:

Formula introdusa pentru Valoare este [Pret]* [Cantitate], iar pentru Total selectăm „Sum”.
În modul View acest query va afişa valorile cheltuite pentru fiecare dintre produsele cumpărate:
DenumireProdus | Valoare |
Camasa | $180.00 |
Mere | $4.00 |
Adrian Ionescu

