Втора нормална форма (2NF): определение, правила и примери
Втора нормална форма (2NF) — определение, правила и примери за правилна нормализация на бази данни. Практични стъпки, чести грешки и решения.
Втората нормална форма (2NF) е свойство на релационен модел, по-конкретно на таблици, което е критерий за нормализация на базата данни. За да бъде таблица в 2NF, тя трябва първо да е в първа нормална форма (1NF) и след това да не съдържа частични зависимости — т.е. никаква неключова (непървична) колона не трябва да зависи само от част от композитен (съставен) първичен ключ.
Основни правила и определения
- 1NF (изискване): таблицата трябва да има атомарни стойности и да няма повтарящи се групи.
- Композитен (съставен) ключ: първичният ключ може да се състои от една или повече колони. Когато ключът е само една колона, таблицата, ако е в 1NF, практически удовлетворява изискванията за 2NF, защото няма „части“ от ключа.
- Частична зависимост: ситуация, при която някоя неключова колона зависи само от част от композитния ключ, а не от целия ключ. Това нарушава 2NF.
- 2NF: всички неключови колони трябва да зависят от целия първичен ключ (от всички негови колони), а не само от част от него.
Как да разпознаете частична зависимост
- Идентифицирайте първичния ключ. Ако той е съставен от n колони, помислете дали някоя неключова колона може да се определи само от някоя подсекция (подмножество) на тези n колони.
- Ако такава колона съществува, имате частична зависимост и таблицата не е в 2NF.
- Пример за частична зависимост: Ако ключът е (A, B), а колона C зависи само от A (C ← A) — това е частична зависимост.
Пример: таблица за записване на студенти в предмети
Имаме таблица Enrollment със следните колони:
- StudentID (част от първичния ключ)
- CourseID (част от първичния ключ)
- StudentName
- CourseName
- Instructor
- Grade
Първичният ключ е (StudentID, CourseID). Някои зависимости:
- StudentName зависи само от StudentID (частична зависимост)
- CourseName и Instructor зависят само от CourseID (частична зависимост)
- Grade зависи от целия ключ (StudentID, CourseID) — правилно
Тази таблица не е в 2NF заради частичните зависимости. Корекцията е да я разложим:
- Students(StudentID, StudentName, други атрибути за студент)
- Courses(CourseID, CourseName, Instructor, др.)
- Enrollment(StudentID, CourseID, Grade) — връзка много към много
Стъпки за декомпозиция към 2NF
- Установете дали първичният ключ е композитен.
- Създайте отделни таблици за групите атрибути, които зависят само от част от композитния ключ (т.е. за всяка частична зависимост).
- Запазете таблица, чийто ключ е целият композитен ключ, за атрибутите, които действително зависят от целия ключ.
- Проверете, че няма загуба на данни и че връзките между новите таблици запазват семантиката (чрез външни ключове).
Примерен SQL (демонстрация на разпад)
-- Оригинална (не в 2NF) CREATE TABLE Enrollment ( StudentID INT, CourseID INT, StudentName VARCHAR(100), CourseName VARCHAR(100), Instructor VARCHAR(100), Grade CHAR(2), PRIMARY KEY (StudentID, CourseID) ); -- След нормализация към 2NF CREATE TABLE Students ( StudentID INT PRIMARY KEY, StudentName VARCHAR(100) ); CREATE TABLE Courses ( CourseID INT PRIMARY KEY, CourseName VARCHAR(100), Instructor VARCHAR(100) ); CREATE TABLE Enrollment ( StudentID INT, CourseID INT, Grade CHAR(2), PRIMARY KEY (StudentID, CourseID), FOREIGN KEY (StudentID) REFERENCES Students(StudentID), FOREIGN KEY (CourseID) REFERENCES Courses(CourseID) );
Ползи от 2NF
- Намаляване на излишните данни (redundancy).
- Премахване на аномалии при актуализация, изтриване и вмъкване.
- По-ясна структура и по-добра поддръжка на данните.
Ограничения и следващи стъпки
- 2NF не решава транзитивните зависимости (когато неключова колона зависи от друга неключова колона). За това се използва Трета нормална форма (3NF).
- Понякога напълно нормализираните схеми водят до много таблици и по-сложни заявки; при практическа работа трябва да се балансира между нормализация и производителност.
Често срещани грешки
- Пропускане на проверка за частични зависимости при композитни ключове.
- Неправилно определяне кои атрибути са „ключови“ (prime) и кои са „неключови“.
- Смесване на проблема на 2NF с този на 3NF — те са различни нива и решават различни видове зависимости.
Кратко обобщение: Таблица е в 2NF, ако е в 1NF и няма частични зависимости на неключови атрибути спрямо част от композитен първичен ключ. Ако откриете такива зависимости, разложете таблицата в няколко по-малки таблици, така че всяка неключова колона да зависи от целия ключ на таблицата, в която се намира.
обискирам