Normalizarea reduce redundanța și anomalii (la ștergere/actualizare):
- FN1: valorile dintr-o coloană sunt atomice (nu liste în aceeași celulă).
- FN2: e în FN1 și nu are dependențe parțiale (atributele non-cheie depind de tota cheia, nu doar o parte).
- FN3: e în FN2 și nu are dependențe transitive (un atribut non-cheie nu depinde de alt atribut non-cheie).
Exemplu FN3 încălcat: Student(id, nume, oras, tara) — tara depinde de oras, nu direct de id. Se separă în Oras(id, nume, tara).
python.py
# Tabela nenormalizata: 'oras' si 'tara' depind de 'oras', nu direct de 'id' (incalca FN3)
studenti = [
{"id": 1, "nume": "Ana", "oras": "Cluj", "tara": "România"},
{"id": 2, "nume": "Radu", "oras": "Cluj", "tara": "România"},
]
def normalizeaza_fn3(studenti):
# extragem dependenta tranzitiva oras -> tara intr-o tabela separata
orase = {s["oras"]: s["tara"] for s in studenti}
studenti_fn3 = [{"id": s["id"], "nume": s["nume"], "oras": s["oras"]} for s in studenti]
return studenti_fn3, orase
studenti_fn3, tabela_oras = normalizeaza_fn3(studenti)
print("Student:", studenti_fn3)
print("Oras:", tabela_oras)
Regula practică: fiecare tabelă descrie un singur tip de lucru. Dacă o coloană depinde de altceva decât cheia, mut-o în alt tabel.
