Перейти к основному содержимому

Нормальные формы баз данных

Напомним, нормализация (ссылка) — (ссылка) организация данных в таблицах БД так, чтобы:

  • устранить избыточность данных (уменьшается объем хранения, ниже риск рассинхронизации и проще управление)
  • улучшить целостность данных (поддерживаются правильные связи, меньше ошибок)
  • уменьшить их дублирование (оптимизация структуры, лучшая производительность)

Процесс нормализации

Таблицы делятся на мелкие, связанные по смыслу, а между ними создаются связи.

Происходит шаг за шагом. В результате БД приводится к нормальным формам (NF)

Нормальные формы (NF) – требование к структуре таблиц реляционных БД

  • Чем выше NF, тем меньше лишних и зависимых данных -> БД работает быстрее и точнее, но усложняется её структура
  • БД считается нормализованной после достижения третьей нормальной формы. NF выше третьей нужны для устранения более сложных зависимостей
  • Чтобы таблица была в нужной NF, она сначала должна соответствовать всем предыдущим формам.

Первая нормальная форма (1NF)

Требования:

  • каждое поле должно содержать атомарные значения (неделимые на части)
  • отсутствие повторяющихся групп данных

Пример:

  • до: таблица с полем "телефоны", где у одного человека несколько телефонов в одной ячейке
  • после: каждый телефон записан в отдельной строке

Вторая нормальная форма (2NF)

Частичные зависимости разделяются на новые таблицы.

  • Все столбцы должны зависеть полностью от первичного ключа, а не только от его части (если первичный ключ состоит из нескольких полей)

Пример:

  • до: в таблице заказов хранятся поля "имя клиента", "адрес клиента" и "ID заказа". Эти данные повторяются для каждого заказа клиента, что приводит к избыточности.
  • после: эти данные выносятся в отдельную таблицу "клиенты", чтобы убрать дублирование в каждом заказе одного клиента

Третья нормальная форма (3NF)

  • Все столбцы зависят только от первичного ключа (т.е. устранение транзитивных зависимостей: когда второй атрибут зависит от первого, а третий — от второго)

Пример:

  • до: в таблице товаров есть поле "город" и "почтовый индекс". "почтовый индекс" зависит от "города", а не от товара.
  • после: данные разделяются: "город" и "почтовый индекс" в отдельную таблицу адресов, а "товар" — в другую

Нормальная форма Бойса-Кода (BCNF)

Нормальная форма Бойса-Кода (BCNF) — более строгая версия 3NF, решает некоторые её недостатки

  • Каждый атрибут, от которого зависят другие поля в таблице, однозначно идентифицирует запись (был кандидатным ключом)

Четвертая нормальная форма (4NF)

  • Удаляются многозначные зависимости (несколько значений зависят от одного атрибута)

Пример:

  • до: в таблице "студенты" есть поля "курсы" и "хобби". Один студент может учиться на нескольких курсах и иметь несколько хобби, что приведёт к дублированию данных.
  • после: зависимости разделяются на отдельные таблицы: одна для курсов, другая для хобби, чтобы избежать повторений

Пятая нормальная форма (5NF)

  • Удаляются JOIN-зависимости, данные не могут быть разделены на более мелкие части без потери информации. Предотвращает аномалии при соединении данных из множества таблиц.

Пример:

  • в системе договоров один договор может включать несколько услуг от разных компаний

Шестая нормальная форма (6NF)

Редко используется, дальнейший шаг нормализации для поддержки временных данных и их зависимостей

  • Когда данные меняются во времени (например, истории изменений зарплат), чтобы каждая запись была уникальной и не дублировалась

Пример нормализации таблицы

Таблица с информацией о заказах, поля: OrderID, CustomerName, CustomerAddress, ProductID, ProductName, Quantity, ProductPrice.

  1. 1NF: разделить CustomerName и CustomerAddress на отдельные поля.
  2. 2NF: убрать зависимость от части ключа. Информация о клиенте выносится в отдельную таблицу Customers, а о товаре — в таблицу Products.
  3. 3NF: устранить транзитивные зависимости (от неключевых полей). Если ProductName и ProductPrice зависят от ProductID, их вынести в таблицу Products.

Результат: связанные таблицы (Orders, Customers, Products).

Каждая отвечает за свою часть данных, минимум избыточности и снижается вероятность аномалии

Подборка материалов по теме нормальные формы БД

  1. Нормализация отношений. Шесть нормальных форм
  2. Как привести данные в форму: что такое нормализация и зачем она нужна
  3. Что такое нормализация базы данных?
  4. Аномалии в реляционной модели
  5. Функциональная зависимость в СУБД: что такое, виды и примеры
  6. Ключи СУБД: типы-кандидаты, супер, первичные, внешние ключи с примером
  7. Нормализация базы данных SQL
  8. Первая нормальная форма
  9. Первая нормальная форма (1NF) базы данных
  10. Нормальные формы: первая и вторая
  11. Вторая нормальная форма
  12. Вторая нормальная форма (2NF) базы данных
  13. Третья нормальная форма
  14. Нормальные формы: третья и Бойса-Кодда
  15. Четвертая нормальная форма (4NF) базы данных
  16. Пятая нормальная форма (5NF)
  17. Нормализация и нормальные формы (описание 1-6 NF)
  18. Пятая нормальная форма (5NF)
  19. Шестая нормальная форма (6NF) базы данных
  20. Нормализация СУБД: пример базы данных 1NF, 2NF, 3NF
  21. Сущности и связи: как и для чего системные аналитики создают ER‑диаграммы
  22. Учимся проектированию Entity Relationship-диаграмм

Видео

  1. Базы данных. Функциональные зависимости
  2. Нормальные формы базы данных. Три нормальных формы, нормализация и денормализация БД
  3. Нормальные формы баз данных: Объясняем на пальцах
  4. Цикл видео: Базы данных. Нормализация отношений
  5. Нормализация в базе данных
  6. Нормальная форма Бойса-Кодда (BCNF). Правила нормализации БД
  7. Руководство по проектированию реляционных баз данных (НФ)
  8. Нормализация отношений. Первая и вторая нормальные формы
  9. Базы данных. НФ БК; 4-5 нормальные формы

Книги

  1. Технологии проектирования баз данных -- Дмитрий Осипов (Глава 6-7)
  2. Основы технологий баз данных — Новиков Б. А. / Б. А. Новиков, Е. А. Горшкова, Н. Г. Графеева; под ред. Е. В. Рогова
  3. Основы баз данных — Кузнецов (Лекции 7-9)

А для тех, кто готов изучать базы данных глубже — напоминаем о наших подборках:

  1. Основные понятия баз данных
  2. SQL vs NoSQL: отличие реляционных и нереляционных БД
  3. Виды нереляционных БД. Какие бывают NoSQL базы данных
  4. Типы связей в БД. Нормализация
  5. Шпаргалка по выбору правильной СУБД
  6. Памятка по SQL
  7. Денормализация в БД и не только
  8. Хранимые процедуры и пользовательские функции в БД
  9. Масштабирование БД. Партиционирование, шардирование и репликация
  10. Требования ACID: Краткий обзор
  11. Индексы в базах данных: краткий обзор
  12. Денормализация в БД и не только
  13. Уровни изоляции транзакций в базах данных
  14. Изолированность транзакций в БД: MVCC, блокировки
  15. Колоночные БД, Cassandra vs PostreSQL
  16. Оконные функции