Что такое нормализация баз данных
Нормализация базы данных — это процесс преобразования схемы базы данных к виду, отвечающему нормальным формам, с целью уменьшения логической избыточности и устранения аномалий при вставке, обновлении и удалении данных. Это пошаговый, обратимый процесс, в ходе которого исходная схема заменяется набором более простых и логичных отношений.
Как это работает
Нормализация основана на анализе функциональных зависимостей между атрибутами. Атрибут B функционально зависит от атрибута A, если каждому значению A соответствует ровно одно значение B. Процесс заключается в последовательном приведении таблиц к нормальным формам — от первой (1НФ) к более высоким (2НФ, 3НФ, НФБК и далее). Каждая следующая форма устраняет определённый тип избыточности и аномалий.
Основные нормальные формы:
- Первая нормальная форма (1НФ) — все атрибуты атомарны, то есть каждое поле содержит одно значение, а не список или множество. Например, вместо поля
телефонысо значениями "123, 456" создают отдельную таблицу для телефонов. - Вторая нормальная форма (2НФ) — таблица находится в 1НФ, и каждый неключевой атрибут полностью зависит от первичного ключа (отсутствуют частичные зависимости). Это актуально для составных ключей.
- Третья нормальная форма (3НФ) — таблица находится в 2НФ, и отсутствуют транзитивные зависимости: неключевые атрибуты не зависят от других неключевых атрибутов.
- Нормальная форма Бойса — Кодда (НФБК) — более строгая версия 3НФ: каждый детерминант (атрибут, от которого зависят другие) является потенциальным ключом.
Пример
Рассмотрим таблицу Заказы:
| ЗаказID | Клиент | Город | Товар | Цена |
|---|---|---|---|---|
| 1 | Иванов | Москва | Ноутбук | 50000 |
| 2 | Петров | СПб | Мышь | 1000 |
Здесь Город зависит от Клиент, а не от ЗаказID, что создаёт избыточность. Приведение к 3НФ разделит таблицу на Клиенты (КлиентID, Имя, Город) и Заказы (ЗаказID, КлиентID, Товар, Цена).
Подводные камни
- Нормализация не гарантирует повышения производительности. Наоборот, из-за увеличения числа соединений (JOIN) запросы могут замедляться. Поэтому на практике часто используют денормализацию для ускорения чтения.
- Нормализация не уменьшает физический объём базы данных: избыточность может снизиться, но добавляются ключи и связи, что увеличивает размер.
- Чрезмерная нормализация усложняет схему и делает её трудной для понимания и поддержки.
- Обратимый процесс: нормализация не теряет информацию, но денормализация может привести к аномалиям, если не контролировать целостность.
Когда использовать
Нормализацию применяют при проектировании баз данных, где важна целостность данных и минимизация избыточности: банковские системы, учётные системы, системы с интенсивной записью. Если система ориентирована на чтение (аналитика, отчёты), часто выбирают денормализованные схемы (например, в хранилищах данных).
Коротко
- Нормализация — это приведение схемы к нормальным формам для устранения избыточности и аномалий.
- Основные формы: 1НФ (атомарность), 2НФ (полная зависимость от ключа), 3НФ (отсутствие транзитивных зависимостей), НФБК.
- Цель — не производительность и не объём, а логическая непротиворечивость данных.
- На практике балансируют между нормализацией и денормализацией в зависимости от сценария использования.