Skip to content

Cum să normalizezi bazele de date — 1NF, 2NF, 3NF

DodaTech Updated 2025-01-15 3 min read

In this tutorial, you'll learn about Cum să normalizezi bazele de date. We cover key concepts, practical examples, and best practices.

Cum să normalizezi bazele de date folosind primele trei forme normale (1NF, 2NF, 3NF) pentru a elimina redundanța, a preveni anomaliiile și a menține integritatea datelor.

Problema

Tabelele prost proiectate conțin date duplicate, dependențe parțiale și tranzitive care duc la anomalii la insert, update și delete. De exemplu, același nume de departament apare de sute de ori în tabela de angajați.

The Wrong Way

Un tabel denormalizat care combină toate datele într-o singură structură:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    customer_email VARCHAR(100),
    product_name VARCHAR(100),
    product_price DECIMAL(10,2),
    category_name VARCHAR(50)
);

-- Date duplicate: același client apare pe mai multe rânduri
INSERT INTO orders VALUES
(1, 'Ana Pop', 'ana@email.com', 'Laptop', 3500, 'Electronics'),
(2, 'Ana Pop', 'ana@email.com', 'Mouse', 150, 'Electronics');

Probleme: Dacă Ana își schimbă emailul, trebuie actualizat în toate rândurile. Dacă ștergem o comandă, pierdem informația despre client.

The Right Way

Aplică normalizarea împărțind în tabele separate:

-- 1NF: Date atomice, cheie primară
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL
);

CREATE TABLE categories (
    category_id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    category_id INT REFERENCES categories(category_id)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),
    product_id INT REFERENCES products(product_id),
    quantity INT NOT NULL
);

Step-by-Step Fix

1. Prima Formă Normală (1NF)

Condiții: valori atomice, fără grupuri repetitive, cheie primară.

Încălcare:

orders: order_id, products (Laptop, Mouse; USB Stick)

Corectat:

orders: order_id, product_id (un produs per rând)
order_items: order_item_id, order_id, product_id, quantity

2. A Doua Formă Normală (2NF)

Condiții: este în 1NF + toate coloanele ne-cheie depind de întreaga cheie primară.

Încălcare: order_id, product_id → product_name (product_name depinde doar de product_id)

Corectat: Separă produsele în tabela proprie.

3. A Treia Formă Normală (3NF)

Condiții: este în 2NF + fără dependențe tranzitive (coloane ne-cheie care depind de alte coloane ne-cheie).

Încălcare: customer_id → city → zip_code (zip_code depinde de city, nu direct de customer_id)

Corectat: Creează o tabelă addresses.

Prevention Tips

  • Proiectează întotdeauna în 3NF, denormalizează doar când ai nevoie măsurată de performanță
  • Identifică dependențele funcționale între coloane înainte de a crea tabelele
  • Folosește chei străine pentru a menține integritatea referențială
  • Documentează deciziile de denormalizare pentru mentenanță viitoare

Greșeli comune cu normalizarea

  1. Ignorarea 1NF — coloane cu valori multiple separate prin virgulă
  2. Normalizare excesivă — peste 3NF fără motiv real, ducând la JOIN-uri inutile
  3. Dependențe tranzitive nerezolvate — date care depind de alte date non-cheie
  4. Chei primare compuse greșite — coloane în plus care nu fac parte din cheie
  5. Denormalizarea prematură — optimizezi pentru performanță înainte să ai date

Exercițiu practic

Normalizează următorul tabel la 3NF: enrollments(student_id, student_name, course_id, course_name, instructor_name, instructor_office, grade)

Soluție (3 tabele):

  • students(student_id, student_name)
  • courses(course_id, course_name, instructor_id)
  • instructors(instructor_id, instructor_name, instructor_office)
  • enrollments(student_id, course_id, grade)

FAQ

### Care este diferența dintre 2NF și 3NF?

2NF elimină dependențele parțiale (coloane care depind de o parte a cheii primare). 3NF elimină dependențele tranzitive (coloane care depind de alte coloane ne-cheie).

Când ar trebui să denormalizez?

Când ai probleme măsurate de performanță cu JOIN-uri multe, când rulezi interogări analitice pe date istorice, sau în tabele de tip star schema în data warehouse.

Normalizarea rezolvă toate problemele de performanță?

Nu. Normalizarea reduce redundanța dar crește numărul de JOIN-uri. Pentru tabele foarte mari, uneori denormalizarea controlată este necesară pentru performanță.

Construit de dezvoltătorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech se integrează nativ cu bazele de date pentru productivitate și securitate sporite.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro