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.out fă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)
101Procesor Intel Core i5Componente950.00152026-09-10
102Placă video RTX 4060Componente1650.5082026-09-14
103SSD Kingston 1TB NVMeStocare340.00252026-10-01
104Monitor Dell 24 inchPeriferice680.00122026-10-05
105Tastatură Mecanică RGBPeriferice220.00302026-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.

Exemplu: Căutarea unui elev după CNP într-o bază de date națională cu 500.000 de elevi face doar ~19 comparații (căutare logaritmică), nu 500.000.

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.

Exemplu: Câmpul 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++.

Exemplu: Comanda 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).

Exemplu: Dacă doi clienți comandă în aceeași secundă ultimul laptop din stoc, SGBD-ul procesează cererile pe rând și nu permite vânzarea dublă.

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.

Exemplu: Într-un catalog digital, elevul are doar drept de citire (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.

Exemplu: Numele dirigintelui se trece o singură dată în tabelul 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)
101Popescu Andrei9.8012A
102Ionescu Maria10.0012B
103Strat Matei9.4012A
104Radu Elena9.6512C
105Vasile Barbu8.9012B

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

Regulă de implementare: Cheia primară din primul tabel se adaugă ca Cheie Externă (FK) în al doilea tabel, având aplicată restricția de unicitate (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
101Popescu Andrei
102Ionescu Maria
103Strat Matei

Tabel 2: ATESTATE

ID_Atestat (PK)Titlu_ProiectNotaID_Elev (FK, Unic)
AT-01Gestiunea unei Biblioteci în C#10101
AT-02Magazin Online cu PHP și MySQL10102
AT-03Algoritmul lui Dijkstra Vizual9103

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-10Dumitrescu Vlad
P-20Marin Cristina
P-30Stan Alexandru

Tabel 2: CARTI_IDENTITATE

Serie_Numar (PK)Data_ExpirariiID_Pers (FK, Unic)
RK-1234562031-05-12P-10
RX-6543212029-11-03P-20
TM-9871232034-02-20P-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)UsernameEmail
U1andrei_devandrei@scoala.ro
U2maria_codemaria@scoala.ro
U3matei_xmatei@scoala.ro

Tabel 2: PROFILURI_SETARI

ID_Profil (PK)Tema_InterfataLimbaID_User (FK, Unic)
PR-1Dark ModeRomânăU1
PR-2Light ModeEnglezăU2
PR-3Dark ModeRomâ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.

Regulă de implementare: Cheia primară de pe partea „1” (tabelul părinte) se adaugă ca Cheie Externă (FK) în tabelul de pe partea „M” (tabelul copil), unde valorile ei se pot repeta.

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)ProfilDiriginte
12AMate-Info IntensivProf. Ionescu Dan
12BMate-InfoProf. Vasile Ana

Tabel Copil (M): ELEVI

ID_Elev (PK)Nume_ElevID_Clasa (FK)
101Popescu Andrei12A
102Ionescu Maria12B
103Strat Matei12A
104Radu Elena12A

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_ClientOras
CL-1Munteanu GeorgeCluj-Napoca
CL-2Lazar IoanaTimișoara

Tabel Copil (M): COMENZI

ID_Comanda (PK)Data_ComenziiTotal_RONID_Client (FK)
CMD-5012026-10-02450.00CL-1
CMD-5022026-10-151200.00CL-1
CMD-5032026-10-18340.00CL-2
CMD-5042026-10-2589.90CL-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_LabEtaj
LAB-1Informatică C++Etaj 1
LAB-2Robotică & RețeleEtaj 2

Tabel Copil (M): CALCULATOARE

Cod_PC (PK) Adresa_IPRAM_GBID_Lab (FK)
PC-01192.168.1.1016LAB-1
PC-02192.168.1.1116LAB-1
PC-03192.168.2.1032LAB-2
PC-04192.168.2.1132LAB-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.

Regulă de implementare: Două tabele nu pot fi legate direct printr-o relație M:M. Se creează obligatoriu un al treilea tabel, numit Tabel de Legătură (sau Tabel Asociativ), care preia Cheile Primare din ambele tabele sub formă de Chei Externe (FK), transformând relația M:M în două relații 1:M.

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
101Popescu Andrei
102Ionescu Maria

2. Tabelul OPTIONALE (Partea 1)

ID_Opt (PK)Denumire_Optional
OPT-1Programare Web
OPT-2Baze 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
1101 (Popescu Andrei)OPT-1 (Programare Web)2026-09-15
2101 (Popescu Andrei)OPT-2 (Baze de Date SQL)2026-09-16
3102 (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-102026-10-12
CMD-202026-10-14

2. Tabelul PRODUSE_IT (Partea 1)

ID_Prod (PK)DenumirePret_RON
P-1SSD Kingston 1TB340.00
P-2Mouse Logitech G502250.00

3. Tabelul de Legătură: DETALII_COMANDA (Partea M pentru ambele tabele)

ID_Detaliu (PK)ID_Cmd (FK)ID_Prod (FK)Cantitate (Buc)
1CMD-10P-1 (SSD Kingston 1TB)2
2CMD-10P-2 (Mouse Logitech G502)1
3CMD-20P-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_DevLimbaj_Principal
D-01Enache TudorC++ / Python
D-02Nistor DianaJavaScript / SQL

2. Tabelul PROIECTE (Partea 1)

ID_Proiect (PK)Nume_Proiect
PRJ-AAplicație Mobilă Bancară
PRJ-BPlatformă 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
1D-01 (Enache Tudor)PRJ-A (Aplicație Bancară)Backend Developer
2D-01 (Enache Tudor)PRJ-B (Platformă E-Learning)Arhitect Bază de Date
3D-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:

1. Tabelele TARI și CAPITALE (o țară are o singură capitală oficială, iar o capitală aparține unei singure țări).
2. Tabelele 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).
3. Tabelele 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ă).
4. Tabelele ACTORI și FILME (un actor joacă în mai multe filme, iar într-un film joacă mai mulți actori).
5. Tabelele 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:

1. Tabelul ELEVI conține coloanele (ID_Elev, Nume, Prenume, Clasa, Medie_Generala) și are memorate datele a 28 de elevi. Care sunt gradul și cardinalitatea acestei relații?

A. Gradul este 28 și cardinalitatea este 5.
B. Gradul este 5 și cardinalitatea este 28.
C. Gradul este 4 și cardinalitatea este 28.

2. Care dintre următoarele afirmații despre Cheia Primară (Primary Key - PK) a unui tabel este ADEVĂRATĂ?

A. Poate conține valoarea NULL pe cel mult un rând din tabel.
B. Trebuie să fie obligatoriu de tip numeric întreg (INT).
C. Valorile sale trebuie să fie unice și nu pot fi lăsate necompletate (NOT NULL).

3. Între tabelele PROFESORI (partea 1) și DISCIPLINE (partea M) există o relație de tip 1:M (un profesor poate preda mai multe discipline, dar o disciplină este predată de un singur profesor). Cum se realizează legătura?

A. Câmpul ID_Profesor se adaugă ca și Cheie Externă (FK) în tabelul DISCIPLINE.
B. Câmpul ID_Disciplina se adaugă ca și Cheie Externă (FK) în tabelul PROFESORI.
C. Este obligatorie crearea unui al treilea tabel de legătură.

4. Pentru a implementa o relație Mulți-la-Mulți (M:M) între tabelele ELEVI și CONCURSURI, creăm tabelul de legătură PARTICIPARI. Ce rol au câmpurile ID_Elev și ID_Concurs în tabelul PARTICIPARI?

A. Fiecare dintre ele este independent restricționat să nu se repete pe niciun rând din PARTICIPARI.
B. Sunt Chei Externe (FK) care fac referire la cheile primare din ELEVI, respectiv CONCURSURI.
C. Sunt simple câmpuri text fără nicio restricție de integritate.

5. În tabelul CLASE există doar clasele cu codurile 12A, 12B și 12C. Ce se întâmplă dacă încercăm să inserăm în tabelul ELEVI un elev care are completată la Cheia Externă ID_Clasa valoarea 12Z?

A. SGBD-ul respinge înregistrarea deoarece încalcă restricția de integritate referențială.
B. SGBD-ul șterge automat toți ceilalți elevi din tabel.
C. Înregistrarea este acceptată fără nicio verificare.

6. Care este principalul motiv pentru care nu păstrăm toate informațiile unei școli (datele elevilor, datele claselor, numele diriginților, opționalele) într-un singur tabel uriaș?

A. Deoarece un tabel într-o bază de date nu poate avea mai mult de 4 coloane.
B. Pentru a elimina redundanța datelor (repetarea acelorași informații pe zeci de rânduri) și erorile de actualizare.
C. Pentru că limbajul SQL funcționează doar pe tabele cu maximum 5 rânduri.
Scor curent: 0 / 11 puncte
Rezolvă cele 5 scenarii de relații (Partea I) și cele 6 întrebări grilă (Partea a II-a)!