Нормальные формы баз данных
Напомним, нормализация (ссылка) — (ссылка) организация данных в таблицах БД так, чтобы:
- устранить избыточность данных (уменьшается объем хранения, ниже риск рассинхронизации и проще управление)
- улучшить целостность данных (поддерживаются правильные связи, меньше ошибок)
- уменьшить их дублирование (оптимизация структуры, лучшая производительность)
Процесс нормализации
Таблицы делятся на мелкие, связанные по смыслу, а между ними создаются связи.
Происходит шаг за шагом. В результате БД приводится к нормальным формам (NF)
Нормальные формы (NF) – требование к структуре таблиц реляционных БД
- Чем выше NF, тем меньше лишних и зависимых данных -> БД работает быстрее и точнее, но усложняется её структура
- БД считается нормализованной после достижения третьей нормальной формы. NF выше третьей нужны для устранения более сложных зависимостей
- Чтобы таблица была в нужной NF, она сначала должна соответствовать всем предыдущим формам.
Первая нормальная форма (1NF)
Требования:
- каждое поле должно содержать атомарные значения (неделимые на части)
- отсутствие повторяющихся групп данных
Пример:
- до: таблица с полем "телефоны", где у одного человека несколько телефонов в одной ячейке
- после: каждый телефон записан в отдельной строке
Вторая нормальная форма (2NF)
Частичные зависимости разделяются на новые таблицы.
- Все столбцы должны зависеть полностью от первичного ключа, а не только от его части (если первичный ключ состоит из нескольких полей)
Пример:
- до: в таблице заказов хранятся поля "имя клиента", "адрес клиента" и "ID заказа". Эти данные повторяются для каждого заказа клиента, что приводит к избыточности.
- после: эти данные выносятся в отдельную таблицу "клиенты", чтобы убрать дублирование в каждом заказе одного клиента
Третья нормаль ная форма (3NF)
- Все столбцы зависят только от первичного ключа (т.е. устранение транзитивных зависимостей: когда второй атрибут зависит от первого, а третий — от второго)
Пример:
- до: в таблице товаров есть поле "город" и "почтовый индекс". "почтовый индекс" зависит от "города", а не от товара.
- после: данные разделяются: "город" и "почтовый индекс" в отдельную таблицу адресов, а "товар" — в другую
Нормальная форма Бойса-Кода (BCNF)
Нормальная форма Бойса-Кода (BCNF) — более строгая версия 3NF, решает некоторые её недостатки
- Каждый атрибут, от которого зависят другие поля в таблице, однозначно идентифицирует запись (был кандидатным ключом)
Четвертая нормальная форма (4NF)
- Удаляются многозначные зависимости (несколько значений зависят от одного атрибута)
Пример:
- до: в таблице "студенты" есть поля "курсы" и "хобби". Один студент может учиться на нескольких курсах и иметь несколько хобби, что приведёт к дублированию данных.
- после: зависимости разделяются на отдельные таблицы: одна для курсов, другая для хобби, чтобы избежать повторений
Пятая нормальная форма (5NF)
- Удаляются JOIN-зависимости, данные не могут быть разделены на более мелкие части без потери информации. Предотвращает аномалии при соединении данных из множества таблиц.
Пример:
- в системе договоров один договор може т включать несколько услуг от разных компаний
Шестая нормальная форма (6NF)
Редко используется, дальнейший шаг нормализации для поддержки временных данных и их зависимостей
- Когда данные меняются во времени (например, истории изменений зарплат), чтобы каждая запись была уникальной и не дублировалась
Пример нормализации таблицы
Таблица с информацией о заказах, поля: OrderID, CustomerName, CustomerAddress, ProductID, ProductName, Quantity, ProductPrice.
- 1NF: разделить CustomerName и CustomerAddress на отдельные поля.
- 2NF: убрать зависимость от части ключа. Информация о клиенте выносится в отдельную таблицу Customers, а о товаре — в таблицу Products.
- 3NF: устранить транзитивные зависимости (от неключевых полей). Если ProductName и ProductPrice зависят от ProductID, их вынести в таблицу Products.
Результат: связанные таблицы (Orders, Customers, Products).
Каждая отвечает за свою часть данных, минимум избыточности и снижается вероятность аномалии
Подборка материалов по теме нормальные формы БД
- Нормализация отношений. Шесть нормальных форм
- Как привести данные в форму: что такое нормализация и зачем она нужна
- Что такое нормализация базы данных?
- Аномалии в реляционной модели
- Функциональная зависимость в СУБД: что такое, виды и примеры
- Ключи СУБД: типы-кандидаты, супер, первичные, внешние ключи с примером
- Нормализация базы данных SQL
- Первая нормальная форма
- Первая нормальная форма (1NF) базы данных
- Нормальные формы: первая и вторая
- Вторая нормальная форма
- Вторая нормальная форма (2NF) базы данных
- Третья нормальная форма
- Нормальные формы: третья и Бойса-Кодда
- Четвертая нормальная форма (4NF) базы данных
- Пятая нормальная форма (5NF)
- Нормализация и нормальные формы (описание 1-6 NF)
- Пятая нормальная форма (5NF)
- Шестая нормальная форма (6NF) базы данных
- Нормализация СУБД: пример базы данных 1NF, 2NF, 3NF
- Сущности и связи: как и для чего системные аналитики создают ER‑диаграммы
- Учимся проектированию Entity Relationship-диаграмм
Видео
- Базы данных. Функциональные зависимости
- Нормальные формы базы данных. Три нормальных формы, нормализация и денормализация БД
- Нормальные формы баз данных: Объясняем на пальцах
- Цикл видео: Базы данных. Нормализация отношений
- Нормализация в базе данных
- Нормальная форма Бойса-Кодда (BCNF). Правила нормализации БД
- Руководство по проектированию реляционных баз данных (НФ)
- Нормализация отношений. Первая и вторая нормальные формы
- Базы данных. НФ БК; 4-5 нормальные формы
Книги
- Технологии проектирования баз данных -- Дмитрий Осипов (Глава 6-7)
- Основы технологий баз данных — Новиков Б. А. / Б. А. Новиков, Е. А. Горшкова, Н. Г. Графеева; под ред. Е. В. Рогова
- Основы баз данных — Кузнецов (Лекции 7-9)
А для тех, кто готов изучать базы данных глубже — напоминаем о наших подборках:
- Основные понятия баз данных
- SQL vs NoSQL: отличие реляционных и нереляционных БД
- Виды нереляционных БД. Какие бывают NoSQL базы данных
- Типы связей в БД. Нормализация
- Шпаргалка по выбору правильной СУБД
- Памятка по SQL
- Денормализация в БД и не только
- Хранимые процедуры и пользовательские функции в БД
- Масштабирование БД. Партиционирование, шардирование и репликация
- Требования ACID: Краткий обзор
- Индексы в базах данных: краткий обзор
- Денормализация в БД и не только
- Уровни изоляции транзакций в базах данных
- Изолированность транзакций в БД: MVCC, блокировки
- Колоночные БД, Cassandra vs PostreSQL
- Оконные функции