Нормализацията е основен процес в проектирането на релационни бази данни, чиято цел е да се сведат до минимум излишъците от данни, да се подобри целостта на данните и да се улесни тяхното поддържане. Нормализацията е независима от конкретната система за управление на бази данни (СУБД) – тя важи еднакво както за Oracle, така и за MySQL, PostgreSQL, SQL Server и други.
Какво представлява нормализацията?
Нормализацията е процесът на разделяне на големи таблици в по-малки и свързани помежду си таблици и определяне на връзките между тях с помощта на ключове. Това се прави поетапно чрез преминаване през различни нормални форми (normal forms, NF).
Причини за нормализация
- Премахване на дублирани данни
- Минимизиране на аномалии при вмъкване, актуализация и изтриване
- Подобряване на логическата структура на базата данни
- Улесняване на поддръжката и бъдещото развитие
Нормални форми (Normal Forms)
Нормализацията се осъществява чрез прилагане на поредица от нормални форми, всяка от които налага специфични правила. По-долу са описани най-важните нормални форми:
1. Първа нормална форма (1NF)
Изискване: Всяко поле в таблица трябва да съдържа атомарна (неразделима) стойност и всички записи да бъдат уникални.
Пример за нарушение:
Студент | Телефони |
---|---|
Иван | 0888123456, 0888123457 |
Нормализирано (1NF):
Студент | Телефон |
---|---|
Иван | 0888123456 |
Иван | 0888123457 |
2. Втора нормална форма (2NF)
Изискване: Да бъде в 1NF и всички неключови атрибути да зависят напълно от първичния ключ.
Подходяща при съставен ключ – трябва да се премахнат частичните зависимости.
Пример за нарушение:
СтудентID | КурсID | Име на студент | Име на курс |
---|
Име на студент
зависи само отСтудентID
, а не от целия съставен ключ.
Нормализирано (2NF):
- Таблица
Студенти(СтудентID, Име)
- Таблица
Курсове(КурсID, Име)
- Таблица
Записвания(СтудентID, КурсID)
3. Трета нормална форма (3NF)
Изискване: Да бъде в 2NF и всички неключови атрибути да зависят само от първичния ключ (без транзитивни зависимости).
Пример за нарушение:
КлиентID | Име на клиент | Град | Пощенски код |
---|
Град
зависи отПощенски код
, който пък зависи отКлиентID
.
Нормализирано (3NF):
- Таблица
Клиенти(КлиентID, Име, Пощенски код)
- Таблица
Градове(Пощенски код, Град)
Boyce-Codd нормална форма (BCNF)
Подобна на 3NF, но по-строга. Изисква, че всеки детерминант трябва да бъде ключ.
Използва се, когато:
- има множество кандидат-ключове
- има зависимости, които нарушават 3NF, въпреки че таблицата е във 2NF
4-та нормална форма (4NF)
Изискване: Да бъде в BCNF и да няма многостойностни зависимости.
Пример за нарушение:
Преподавател | Курс | Език |
---|---|---|
Иван | Бази данни | Английски |
Иван | Бази данни | Немски |
- Ако
Курс
иЕзик
са независими, това нарушава 4NF.
5-та нормална форма (5NF) или Проекционно-съединителна нормална форма
Използва се рядко и касае ситуации, при които:
- Една таблица се разделя на множество чрез съединения, за да се избегнат аномалии на съединенията.
Денормализация
Понякога в реалния свят се използва и обратният процес – денормализация, при който умишлено се допуска дублиране с цел:
- по-добра производителност (по-малко
JOIN
-ове) - по-бързо извличане на отчетни данни
Денормализацията е компромис между ефективност и целостта на данните.
Нормализацията е критично важна при проектирането на всяка релационна база данни. Правилното прилагане на нормалните форми гарантира:
- по-лесна поддръжка
- по-малко грешки
- по-качествен модел на данни
Въпреки че процесът изглежда академичен, добрият DBA или разработчик знае кога да нормализира и кога да денормализира за баланс между чистота и производителност.