1. De la Structuri de Date în C++ la Baze de Date
💻 De ce nu mai sunt suficiente fișierele text (date.in) și vectorii de struct?
Până în clasa a XI-a, atunci când aveam de gestionat datele mai multor elevi sau produse în C++, declaram o structură (de exemplu, struct Produs
{ int id; char nume[40]; float pret; };), citeam datele dintr-un fișier text într-un vector și le prelucram în memoria RAM.
Această metodă funcționează excelent pentru problemele de algoritmică, dar devine imposibil de folosit într-o aplicație reală (cum ar fi un magazin online, catalogul școlar electronic sau sistemul unei bănci):
❌ Lucrul cu fișiere text în C++
- Căutare lentă: Pentru a găsi un produs într-un fișier nesortat cu 1.000.000 de linii, trebuie să citim fișierul secvențial, pas cu pas — complexitate O(n).
- Modificare greoaie: Ca să ștergem sau să modificăm un singur rând de la mijlocul fișierului text, trebuie să rescriem tot fișierul.
- Un singur utilizator: Două persoane nu pot scrie simultan în același fișier
date.outfără a strica datele.
✅ Lucrul cu o Bază de Date
- Regăsire instantanee: Datele sunt indexate automat, iar căutarea se face similar cu căutarea binară — complexitate O(log2 n).
- Actualizare directă: Putem modifica sau șterge o singură înregistrare printr-o comandă simplă, fără a afecta restul datelor.
- Acces multiplu: Mii de utilizatori pot căuta și plasa comenzi simultan, în siguranță.
În informatică, facem distincție între două noțiuni care lucrează împreună:
1. Baza de Date (BD): Reprezintă colecția propriu-zisă de date organizate în tabele corelate între ele, stocate pe disc cu o redundanță (repetare inutilă a datelor) minimă.
2. SGBD (Sistemul de Gestiune a Bazelor de Date): Este programul (aplicația software) prin care creăm,
modificăm și interogăm baza de date. Exemple de SGBD-uri cunoscute: Microsoft Access, MySQL, PostgreSQL, Oracle, Microsoft SQL Server.
Comunicarea cu acestea se face, de regulă, prin limbajul SQL (Structured Query Language).
Exemplu: Tabelul PRODUSE_IT (Gestiunea unui magazin de calculatoare)
Fiecare coloană are un tip de date bine stabilit (număr întreg, șir de caractere, număr real cu zecimale sau dată calendaristică):
| ID_Produs (INT) | Denumire (VARCHAR) | Categorie (VARCHAR) | Pret_RON (DECIMAL) | Stoc (INT) | Data_Intrare (DATE) |
|---|---|---|---|---|---|
| 101 | Procesor Intel Core i5 | Componente | 950.00 | 15 | 2026-09-10 |
| 102 | Placă video RTX 4060 | Componente | 1650.50 | 8 | 2026-09-14 |
| 103 | SSD Kingston 1TB NVMe | Stocare | 340.00 | 25 | 2026-10-01 |
| 104 | Monitor Dell 24 inch | Periferice | 680.00 | 12 | 2026-10-05 |
| 105 | Tastatură Mecanică RGB | Periferice | 220.00 | 30 | 2026-10-12 |
2. De ce avem nevoie de baze de date?
Utilizarea unui SGBD oferă șase avantaje esențiale față de păstrarea datelor în simple tabele de calcul sau fișiere text:
1. Viteza de Căutare (Indexarea)
SGBD-ul creează automat indecși (liste ordonate în spate) pentru câmpurile importante, evitând parcurgerea tabelului rând cu rând.
2. Integritatea și Validarea Datelor
Putem impune reguli stricte asupra datelor încă de la definirea tabelului, astfel încât nimeni să nu poată introduce valori greșite.
Medie_Bac este de tip numeric și are restricția să fie între 1.00 și 10.00. Sistemul blochează automat introducerea valorii 11 sau a unui text.
3. Interogări Rapide (Limbajul SQL)
Putem filtra, sorta și calcula statistici (medii, sume, contorizări) printr-o singură linie de comandă, fără să scriem algoritmi de sortare în C++.
SELECT Nume FROM Elevi WHERE Medie >= 9.50; afișează imediat toți elevii cu bursă de merit.
4. Lucrul Simultan și Siguranța
Mai mulți utilizatori pot accesa baza de date în același timp fără conflicte, iar operațiile critice respectă regula „totul sau nimic” (tranzacții).
5. Securitate și Drepturi de Acces
Administratorul bazei de date poate stabili exact ce tabele are voie să vadă sau să modifice fiecare categorie de utilizatori.
SELECT) asupra notelor proprii, în timp ce profesorul are drept de adăugare (INSERT).
6. Eliminarea Redundanței
Prin împărțirea datelor în tabele legate între ele, fiecare informație este stocată o singură dată, economisind spațiu și evitând erorile.
CLASE, nu se copiază în dreptul fiecăruia dintre cei 30 de elevi din clasă.
3. Anatomia unui Tabel (Terminologie Practică și Teoretică)
În bazele de date relaționale (precum MS Access sau MySQL), informațiile sunt păstrate în tabele. In teoria bazelor de date, un tabel mai este numit și relație.
Două proprietăți numerice importante ale oricărui tabel sunt:
• Gradul tabelului (relației): reprezintă numărul de coloane (câmpuri / atribute).
• Cardinalitatea tabelului (relației): reprezintă numărul de rânduri (înregistrări / tupluri) cu date.
Câmp / Coloană (Atribut)
O proprietate a elementelor din tabel (ex: Nume, Medie). Corespunde unui membru dintr-un struct în C++. Determină gradul tabelului.
Înregistrare / Rând (Tuplu)
Setul complet de date despre un singur obiect sau persoană (echivalentul lui v[i] dintr-un vector de structuri). Determină cardinalitatea.
Cheie Primară (PK)
Câmp (sau grup de câmpuri) care identifică unic fiecare rând. Nu poate avea valori repetate (UNIQUE) și nici nu poate fi lăsat necompletat (NOT NULL).
Cheie Externă (FK)
Un câmp dintr-un tabel care ia valori din Cheia Primară a altui tabel, realizând legătura (relația) dintre cele două tabele.
| ID_Elev (PK) | Nume_Elev | Medie_Info | ID_Clasa (FK) |
|---|---|---|---|
| 101 | Popescu Andrei | 9.80 | 12A |
| 102 | Ionescu Maria | 10.00 | 12B |
| 103 | Strat Matei | 9.40 | 12A |
| 104 | Radu Elena | 9.65 | 12C |
| 105 | Vasile Barbu | 8.90 | 12B |
În exemplul de mai sus, tabelul are gradul 4 (4 coloane) și cardinalitatea 5 (5 înregistrări).
4. Tipuri de Relații între Tabele: 1:1, 1:M și M:M
Într-o bază de date relațională, informațiile sunt împărțite pe tabele distincte. În funcție de modul în care înregistrările din două tabele se asociază între ele, există trei tipuri fundamentale de relații. Mai jos analizăm câte 3 exemple concrete pentru fiecare tip:
1 : 1 A. Relația Unu-la-Unu (One-to-One)
Ce înseamnă: O înregistrare din Tabelul A poate fi legată de cel mult o înregistrare din Tabelul B, și invers, o înregistrare din Tabelul B corespunde la o singură înregistrare din Tabelul A.
UNIQUE), astfel încât nicio valoare să nu se poată repeta.
Exemplul 1 (Școală): ELEVI și ATESTATE
La finalul clasei a XII-a, fiecare elev susține un singur proiect de atestat la informatică, iar fiecare proiect individual aparține unui singur elev.
Tabel 1: ELEVI
| ID_Elev (PK) | Nume_Elev |
|---|---|
| 101 | Popescu Andrei |
| 102 | Ionescu Maria |
| 103 | Strat Matei |
Tabel 2: ATESTATE
| ID_Atestat (PK) | Titlu_Proiect | Nota | ID_Elev (FK, Unic) |
|---|---|---|---|
| AT-01 | Gestiunea unei Biblioteci în C# | 10 | 101 |
| AT-02 | Magazin Online cu PHP și MySQL | 10 | 102 |
| AT-03 | Algoritmul lui Dijkstra Vizual | 9 | 103 |
Exemplul 2 (Evidența Populației): PERSOANE și CARTI_IDENTITATE
Fiecare cetățean deține o singură carte de identitate activă, iar o carte de identitate este emisă pentru o singură persoană.
Tabel 1: PERSOANE
| ID_Pers (PK) | Nume_Complet |
|---|---|
| P-10 | Dumitrescu Vlad |
| P-20 | Marin Cristina |
| P-30 | Stan Alexandru |
Tabel 2: CARTI_IDENTITATE
| Serie_Numar (PK) | Data_Expirarii | ID_Pers (FK, Unic) |
|---|---|---|
| RK-123456 | 2031-05-12 | P-10 |
| RX-654321 | 2029-11-03 | P-20 |
| TM-987123 | 2034-02-20 | P-30 |
Exemplul 3 (Aplicație Web): UTILIZATORI și PROFILURI_SETARI
Într-o platformă educațională, fiecare cont de utilizator are un singur profil de preferințe (temă vizuală, limbă, notificări), iar fiecare profil aparține unui singur cont.
Tabel 1: UTILIZATORI
| ID_User (PK) | Username | |
|---|---|---|
| U1 | andrei_dev | andrei@scoala.ro |
| U2 | maria_code | maria@scoala.ro |
| U3 | matei_x | matei@scoala.ro |
Tabel 2: PROFILURI_SETARI
| ID_Profil (PK) | Tema_Interfata | Limba | ID_User (FK, Unic) |
|---|---|---|---|
| PR-1 | Dark Mode | Română | U1 |
| PR-2 | Light Mode | Engleză | U2 |
| PR-3 | Dark Mode | Română | U3 |
1 : M B. Relația Unu-la-Mulți (One-to-Many)
Ce înseamnă: O înregistrare din primul tabel (partea 1 — numit tabel „părinte”) poate fi legată de mai multe înregistrări din al doilea tabel (partea M — numit tabel „copil”), însă o înregistrare din al doilea tabel aparține unei singure înregistrări din primul.
Exemplul 1 (Școală): CLASE (1) și ELEVI (M)
Într-o clasă sunt înscriși mai mulți elevi, dar un elev face parte dintr-o singură clasă. Observați cum 12A se repetă pe coloana ID_Clasa (FK) din tabelul ELEVI.
Tabel Părinte (1): CLASE
| ID_Clasa (PK) | Profil | Diriginte |
|---|---|---|
| 12A | Mate-Info Intensiv | Prof. Ionescu Dan |
| 12B | Mate-Info | Prof. Vasile Ana |
Tabel Copil (M): ELEVI
| ID_Elev (PK) | Nume_Elev | ID_Clasa (FK) |
|---|---|---|
| 101 | Popescu Andrei | 12A |
| 102 | Ionescu Maria | 12B |
| 103 | Strat Matei | 12A |
| 104 | Radu Elena | 12A |
Exemplul 2 (Magazin Online): CLIENTI (1) și COMENZI (M)
Un client înregistrat poate plasa în timp mai multe comenzi, însă o comandă specifică este plasată de un singur client.
Tabel Părinte (1): CLIENTI
| ID_Client (PK) | Nume_Client | Oras |
|---|---|---|
| CL-1 | Munteanu George | Cluj-Napoca |
| CL-2 | Lazar Ioana | Timișoara |
Tabel Copil (M): COMENZI
| ID_Comanda (PK) | Data_Comenzii | Total_RON | ID_Client (FK) |
|---|---|---|---|
| CMD-501 | 2026-10-02 | 450.00 | CL-1 |
| CMD-502 | 2026-10-15 | 1200.00 | CL-1 |
| CMD-503 | 2026-10-18 | 340.00 | CL-2 |
| CMD-504 | 2026-10-25 | 89.90 | CL-1 |
Exemplul 3 (Rețea Școlară): LABORATOARE (1) și CALCULATOARE (M)
Într-un laborator de informatică sunt instalate mai multe calculatoare, dar fiecare calculator se află fizic într-un singur laborator.
Tabel Părinte (1): LABORATOARE
| ID_Lab (PK) | Denumire_Lab | Etaj |
|---|---|---|
| LAB-1 | Informatică C++ | Etaj 1 |
| LAB-2 | Robotică & Rețele | Etaj 2 |
Tabel Copil (M): CALCULATOARE
| Cod_PC (PK) | Adresa_IP | RAM_GB | ID_Lab (FK) |
|---|---|---|---|
| PC-01 | 192.168.1.10 | 16 | LAB-1 |
| PC-02 | 192.168.1.11 | 16 | LAB-1 |
| PC-03 | 192.168.2.10 | 32 | LAB-2 |
| PC-04 | 192.168.2.11 | 32 | LAB-2 |
M : M C. Relația Mulți-la-Mulți (Many-to-Many)
Ce înseamnă: O înregistrare din Tabelul A poate fi asociată cu mai multe înregistrări din Tabelul B, iar o înregistrare din Tabelul B poate fi, la rândul ei, asociată cu mai multe înregistrări din Tabelul A.
Exemplul 1 (Școală): ELEVI — INSCRIERI — OPTIONALE
Un elev se poate înscrie la mai multe cursuri opționale, iar la un curs opțional participă mai mulți elevi.
1. Tabelul ELEVI (Partea 1)
| ID_Elev (PK) | Nume_Elev |
|---|---|
| 101 | Popescu Andrei |
| 102 | Ionescu Maria |
2. Tabelul OPTIONALE (Partea 1)
| ID_Opt (PK) | Denumire_Optional |
|---|---|
| OPT-1 | Programare Web |
| OPT-2 | Baze de Date SQL |
3. Tabelul de Legătură: INSCRIERI (Partea M pentru ambele tabele)
| ID_Ins (PK) | ID_Elev (FK) | ID_Opt (FK) | Data_Inscrierii |
|---|---|---|---|
| 1 | 101 (Popescu Andrei) | OPT-1 (Programare Web) | 2026-09-15 |
| 2 | 101 (Popescu Andrei) | OPT-2 (Baze de Date SQL) | 2026-09-16 |
| 3 | 102 (Ionescu Maria) | OPT-1 (Programare Web) | 2026-09-15 |
Exemplul 2 (Facturare Magazin IT): COMENZI — DETALII_COMANDA — PRODUSE_IT
O comandă poate conține mai multe produse IT, iar același produs IT poate fi cumpărat pe mai multe comenzi diferite. Tabelul de legătură reține și Cantitatea comandată din fiecare produs.
1. Tabelul COMENZI (Partea 1)
| ID_Cmd (PK) | Data_Cmd |
|---|---|
| CMD-10 | 2026-10-12 |
| CMD-20 | 2026-10-14 |
2. Tabelul PRODUSE_IT (Partea 1)
| ID_Prod (PK) | Denumire | Pret_RON |
|---|---|---|
| P-1 | SSD Kingston 1TB | 340.00 |
| P-2 | Mouse Logitech G502 | 250.00 |
3. Tabelul de Legătură: DETALII_COMANDA (Partea M pentru ambele tabele)
| ID_Detaliu (PK) | ID_Cmd (FK) | ID_Prod (FK) | Cantitate (Buc) |
|---|---|---|---|
| 1 | CMD-10 | P-1 (SSD Kingston 1TB) | 2 |
| 2 | CMD-10 | P-2 (Mouse Logitech G502) | 1 |
| 3 | CMD-20 | P-1 (SSD Kingston 1TB) | 1 |
Exemplul 3 (Companie Software): PROGRAMATORI — ALOCARI_PROIECTE — PROIECTE
Un programator poate lucra simultan la mai multe proiecte software, iar la un proiect lucrează o echipă formată din mai mulți programatori.
1. Tabelul PROGRAMATORI (Partea 1)
| ID_Dev (PK) | Nume_Dev | Limbaj_Principal |
|---|---|---|
| D-01 | Enache Tudor | C++ / Python |
| D-02 | Nistor Diana | JavaScript / SQL |
2. Tabelul PROIECTE (Partea 1)
| ID_Proiect (PK) | Nume_Proiect |
|---|---|
| PRJ-A | Aplicație Mobilă Bancară |
| PRJ-B | Platformă E-Learning |
3. Tabelul de Legătură: ALOCARI_PROIECTE (Partea M pentru ambele tabele)
| ID_Alocare (PK) | ID_Dev (FK) | ID_Proiect (FK) | Rol_In_Proiect |
|---|---|---|---|
| 1 | D-01 (Enache Tudor) | PRJ-A (Aplicație Bancară) | Backend Developer |
| 2 | D-01 (Enache Tudor) | PRJ-B (Platformă E-Learning) | Arhitect Bază de Date |
| 3 | D-02 (Nistor Diana) | PRJ-B (Platformă E-Learning) | Frontend Developer |
5. Exersare și Autoevaluare (Quiz)
Verifică-ți cunoștințele parcurgând cele două tipuri de exerciții interactive de mai jos. Primești feedback și explicații imediat după selectarea fiecărui răspuns.
Partea I: Identifică Tipul Relației (1:1, 1:M sau M:M)
Analizează fiecare pereche de entități și apasă pe butonul corespunzător relației corecte:
TARI și CAPITALE (o țară are o singură capitală oficială, iar o capitală aparține unei singure țări).MEDICI și PACIENTI într-o clinică (un medic consultă mai mulți pacienți, iar un pacient poate fi consultat de mai mulți medici de specialități diferite).EDITURI și CARTI (o editură publică mai multe cărți, dar o ediție a unei cărți este publicată de o singură editură).ACTORI și FILME (un actor joacă în mai multe filme, iar într-un film joacă mai mulți actori).DEPARTAMENTE și ANGAJATI (într-un departament lucrează mai mulți angajați, iar fiecare angajat este încadrat într-un singur departament).Partea a II-a: Test Grilă (Tip Bacalaureat)
Selectează varianta corectă pentru fiecare dintre cele 6 întrebări de mai jos: