
Стадия |
Избыточные аномалии |
|
Ненормализованная (нулевая) форма (UNF)
|
Это состояние перед любой нормализацией. В таблице присутствуют избыточные и сложные значения |
|
Первая нормальная форма (1NF)
|
Разбиваются повторяющиеся и сложные значения; все экземпляры становятся атомарными |
|
Вторая нормальная форма (2NF)
|
Частичные зависимости разделяются на новые таблицы. Все строки функционально зависимы от первичного ключа |
|
Третья нормальная форма (3NF)
|
Транзитивные зависимости разбиваются на новые таблицы. Не ключевые атрибуты зависят от первичного ключа |
|
Нормальная форма Бойса-Кода (BCNF)
|
Транзитивные и частичные функциональные зависимости для всех потенциальных ключей разбиваются на новые таблицы |
|
Четвертая нормальная форма (4NF) |
Удаляются многозначные зависимости |
|
Пятая нормальная форма (5NF) |
Удаляются JOIN-зависимости (зависимости соединения) |
|
Номер заказа |
Дата заказа |
Клиент |
Сумма заказа |
|
1 |
01.01.2023 |
Иван |
1000 |
|
2 |
02.01.2023 |
Мария |
1500 |
|
3 |
03.01.2023 |
Пётр |
2000 |
|
Номер заказа |
Дата заказа |
Клиент |
Сумма заказа |
Товары |
|
1 |
01.01.2023 |
Иван |
1000 |
{ручка, бумага} |
|
2 |
02.01.2023 |
Мария |
1500 |
{карандаш, ластик} |
Вторая нормальная форма (2NF)
Вторая нормальная форма требует, чтобы все неключевые атрибуты полностью зависели от первичного ключа.
Примеры:
· Бизнес: таблица «Заказы» с атрибутами «ID заказа», «ID клиента», «Дата заказа» и «Сумма заказа».
· Математика: таблица «Функции» с атрибутами «ID функции», «Аргумент», «Значение», где «Аргумент» однозначно определяет «Значение».
Пример таблицы в правильном варианте (во 2НФ):
|
Номер заказа |
Клиент |
Товар |
Цена |
|
1 |
Иванов |
стул |
1000 |
|
2 |
Петров |
стол |
2000 |
В этом примере каждый атрибут зависит только от первичного ключа (Номер заказа), и нет составных ключей или функциональных зависимостей, которые можно упростить.
Пример таблицы с нарушением 2НФ:
|
Номер заказа |
Отдел |
Клиент |
Товар |
Цена |
|
1 |
Мебель |
Иванов |
стул |
1000 |
|
2 |
Мебель |
Петров |
стол |
2000 |
|
3 |
Мебель |
Семёнов |
диван |
3000 |
|
4 |
Электроника |
Иванов |
ноутбук |
5000 |
В этом примере первичный ключ — это «Номер заказа». Однако атрибут «Отдел»
не связан функционально только с первичным ключом, а скорее связан с выбором
товара. Это создаёт частичную зависимость, что является нарушением 2НФ.
|
Номер заказа |
Клиент |
Товар |
Количество |
Дата заказа |
|
1 |
Иванов И. И. |
Книга А |
5 |
01.01.2023 |
|
2 |
Петров П. П. |
Книга Б |
3 |
02.01.2023 |
|
Номер заказа |
Клиент |
Товар |
Цена |
Общая стоимость |
|
1 |
Иванов И. И. |
Книга А |
100 руб. |
500 руб. |
|
2 |
Петров П. П. |
Книга Б |
150 руб. |
450 руб. |
В этой таблице атрибут «Общая стоимость» зависит не только от первичного
ключа, но и от атрибутов «Товар» и «Количество» (хотя в явном виде количество
не указано).
Третья нормальная форма (3NF)
Когда отношение содержит два или более потенциальных ключа.
Когда эти потенциальные ключи являются составными.
Когда они пересекаются, то есть имеют хотя бы один общий атрибут.
Примеры:
· Бизнес: таблица «Клиенты» с атрибутами «ID клиента», «ФИО», «Адрес» и «Телефон».
· Математика: таблица «Переменные» с атрибутами «ID переменной», «Обозначение», «Значение», где каждая переменная имеет уникальное обозначение и независимое значение.
Пример таблицы в третьей нормальной форме (3НФ):
|
ID |
Имя |
Адрес |
Город |
Телефон |
|
1 |
Иван |
ул. Цветочная, д. 5 |
Москва |
+7 (900) 111-11-11 |
|
2 |
Пётр |
пр. Солнечный, д. 10 |
Санкт-Петербург |
+7 (900) 222-22-22 |
В этой таблице каждый атрибут зависит только от первичного ключа (ID) и не содержит транзитивных зависимостей.
Пример таблицы с нарушением третьей нормальной формы:
|
ID |
Имя |
Адрес |
Город |
Тип адреса |
|
1 |
Иван |
ул. Цветочная, д. 5 |
Москва |
Частный |
|
2 |
Пётр |
пр. Солнечный, д. 10 |
Санкт-Петербург |
Квартира |
|
3 |
Анна |
д. 15, СНТ «Зелёный» |
Подмосковье |
Частный |
В данном примере атрибут «Тип адреса» зависит не только от первичного ключа, но и от атрибута «Адрес». Это создаёт транзитивную зависимость и нарушает 3НФ.
Четвёртая нормальная форма исключает нетривиальные многозначные зависимости.
Примеры:
· Бизнес: таблица «Книги» с атрибутами «ID книги», «Автор», «Жанр» и «Издательство».
· Математика: таблица «Пары чисел» с атрибутами «ID пары», «Первое число», «Второе число», где каждому первому числу соответствует определённое множество вторых чисел.
Пример таблицы в четвёртой нормальной форме (4НФ):
|
Номер заказа |
Клиент |
Товар |
Количество |
|
1 |
Клиент 1 |
Товар 1 |
10 |
|
2 |
Клиент 2 |
Товар 2 |
5 |
В этой таблице каждый атрибут зависит только от первичного ключа, и нет
многозначных зависимостей.
Пример таблицы с нарушением 4НФ:
|
Номер заказа |
Клиент |
Категории товаров |
Товары |
|
1 |
Клиент 1 |
Электроника |
Телевизор, ноутбук |
|
2 |
Клиент 2 |
Одежда |
Куртка, свитер |
|
3 |
Клиент 3 |
Электроника |
Смартфон, наушники |
В этой таблице существует нетривиальная многозначная зависимость: клиент
может заказывать несколько категорий товаров, и каждая категория может
содержать несколько товаров. Это нарушает 4НФ, так как зависимость между
категориями товаров и товарами не является функциональной и может привести к
аномалиям при добавлении, изменении и удалении данных.
Пятая нормальная форма (5NF)
Пятая нормальная форма исключает сложные зависимости между атрибутами, которые не могут быть разложены на более простые.
Примеры:
· Бизнес: таблица «Продажи» с атрибутами «ID продажи», «ID товара», «Цена» и «Количество».
· Математика: таблица «Комбинации» с атрибутами «ID комбинации», «Элемент 1», «Элемент 2», «Элемент 3», где каждая комбинация однозначно определяется тремя элементами.
Пример таблицы в правильном варианте (5 НФ):
|
Номер заказа |
Клиент |
Товар |
Количество |
Дата заказа |
|
1 |
Иванов И. И. |
Ноутбук |
1 шт. |
01.03.2023 |
|
2 |
Петров П. П. |
Мышь |
2 шт. |
02.03.2023 |
В этом примере каждый атрибут зависит только от первичного ключа (номер заказа), и между атрибутами нет сложных зависимостей.
Пример с нарушением 5 НФ:
|
Номер группы товаров |
Группа товаров |
Цена группы |
Количество в группе |
Товары в группе |
|
1 |
Электроника |
1000 |
5 шт. |
Ноутбук, Мышь, Клавиатура |
В этом примере атрибут «Цена группы» зависит не только от первичного ключа, но и от состава группы товаров (набор товаров в группе влияет на цену группы).
Это нарушает 5 НФ, так как зависимость между атрибутами не может быть разложена на более простые зависимости.
Шестая нормальная форма (6NF)
Шестая нормальная форма является наиболее строгой и редко используется на практике. Она предполагает дальнейшее разбиение отношений до атомарного уровня, чтобы исключить любые виды зависимостей между атрибутами, которые могут привести к нарушению целостности данных.
Примеры на практике найти сложно из-за редкости применения, однако можно представить следующую ситуацию:
· Бизнес: представьте систему, где каждая деталь информации хранится отдельно и не зависит от других деталей (например, информация о клиентах, заказах, товарах может быть разделена на несколько таблиц с минимальным количеством зависимостей между ними).
Пример таблицы в шестой нормальной форме (6НФ):
Предположим, у нас есть таблица «Сотрудники» с атрибутами:
|
ID |
Имя |
Отдел |
Должность |
Телефон |
|
|
1 |
Иван |
HR |
Менеджер |
123-45-67 |
Каждый атрибут в этой таблице является атомарным и не зависит от других атрибутов.
Пример с нарушением 6НФ:
Допустим, у нас есть таблица с данными о проектах, которая выглядит следующим образом:
|
ID |
Название проекта |
Руководитель проекта |
Отдел |
Дата начала |
Дата окончания |
Бюджет |
|
1 |
Проект А |
Иван |
HR |
01.01.2023 |
31.12.2023 |
100000 |
Для приведения таблицы в соответствие с 6НФ, можно разбить её на две таблицы: одну с информацией о проектах и другую с информацией о руководителях проектов и их отделах. Например:
Таблица «Проекты»:
|
ID |
Название проекта |
Дата начала |
Дата окончания |
Бюджет |
|
1 |
Проект А |
01.01.2023 |
31.12.2023 |
100000 |
Таблица «Руководители проектов»:
|
ID |
Имя |
Отдел |
|
1 |
Иван |
HR |
Теперь между атрибутами нет явных или неявных зависимостей, и таблица соответствует 6НФ.
Доменно-ключевая нормальная форма (DKNF)
Доменно-ключевая нормальная форма требует, чтобы каждый атрибут в отношении был частью первичного ключа или находился в функциональной зависимости от первичного ключа. Это обеспечивает максимальную степень нормализации и минимизацию избыточности.
Примеры:
· Бизнес: таблица, где «ID клиента» является первичным ключом, а все остальные атрибуты (например, «ФИО», «Адрес», «Телефон») зависят от этого ключа.
· Математика: таблица, где каждый атрибут однозначно определяется через первичный ключ (например, таблица с координатами точек в пространстве, где «ID точки» — первичный ключ, а «x», «y», «z» — зависимые атрибуты).
Пример таблицы в правильном варианте (ДКНФ):
|
ID заказа |
ID товара |
Количество |
Дата заказа |
|
1 |
101 |
2 |
2023-03-15 |
|
2 |
102 |
5 |
2023-03-16 |
В этом примере каждый атрибут (ID заказа, ID товара, Количество, Дата заказа) зависит от первичного ключа (ID заказа), и все атрибуты являются частью определения первичного ключа или функционально зависят от него.
Пример таблицы с нарушением ДКНФ:
|
ID клиента |
Имя клиента |
Город |
Телефон |
Дата последнего заказа |
Последний заказываемый товар |
|
1 |
Иван |
Москва |
+7 (495) 123-45-67 |
2023-03-15 |
Товар 101 |
|
2 |
Пётр |
Санкт-Петербург |
+7 (812) 234-56-78 |
2023-03-16 |
Товар 102 |
В этом примере атрибут «Последний заказываемый товар» нарушает ДКНФ, так как содержит информацию, которая не зависит исключительно от первичного ключа (ID клиента).
Этот атрибут функционально зависит не только от первичного ключа, но и от
других атрибутов (Дата последнего заказа), что приводит к избыточности и
потенциальным ошибкам при обновлении данных.
Научные обоснования и споры
Транзитивная зависимость (ТЗ) — это специфический вид зависимости в реляционных базах данных (БД), который представляет собой косвенную связь между атрибутами одной таблицы. Эта связь приводит к функциональной зависимости (ФЗ), то есть к ситуации, когда одно значение атрибута однозначно определяет другое. Транзитивная зависимость играет ключевую роль в нормализации данных, которая является важным процессом для обеспечения целостности, согласованности и эффективности базы данных.
Рассмотрим пример таблицы Orders,
которая содержит информацию о заказах клиентов:
Пример 1: Интернет-магазин
В интернет-магазине нормализация данных помогает улучшить работу с товарами, категориями и заказами. Например, данные о товарах могут быть разделены на несколько таблиц:
· Таблица товаров (ID товара, название, описание, цена и т.д.)
· Таблица категорий (ID категории, название, описание)
· Таблица заказов (ID заказа, ID клиента, дата заказа, статус и т.д.)
Такая структура позволяет легко добавлять новые товары, категории и заказы, а также упрощает поиск и обработку данных.
Пример 2: Система управления складом
В системе управления складом нормализация данных помогает оптимизировать работу с товарами и складами. Например, данные о товарах могут быть разделены на несколько таблиц:
· Таблица товаров (ID товара, название, описание, цена, поставщик и т.д.)
· Таблица складов (ID склада, название, адрес, вместимость и т.д.)
· Таблица запасов (ID запаса, ID товара, ID склада, количество и т.д.)
Такая структура позволяет легко отслеживать запасы товаров на разных складах и оптимизировать их управление.
Нормализация данных — это важный процесс, который помогает улучшить структуру, производительность и удобство работы с базами данных. Она позволяет избежать дублирования информации, снизить вероятность ошибок и упростить поиск данных. Нормализация особенно полезна для больших систем, где управление данными играет ключевую роль.
Что такое денормализация?
Некоторые специалисты по базам данных утверждают, что излишняя упорядоченность может усложнить и замедлить доступ к информации. Это связано с тем, что в правильно структурированных базах данных множество взаимосвязанных таблиц, что делает запросы сложными и времязатратными. В таких ситуациях они рекомендуют упростить структуру, допустив некоторое дублирование данных. Этот процесс называется денормализацией.
Денормализация — это намеренное ослабление структуры базы данных для ускорения доступа к данным. Мы дублируем информацию, упрощая связи между таблицами, что особенно полезно, когда скорость важнее абсолютной точности данных.
Важно отметить, что денормализация не означает возврат к хаосу. Ненормализованные базы данных характеризуются чрезмерным дублированием, сложностью обновлений и риском потери данных. Денормализация же — это способ оптимизировать базу данных для быстрого доступа, сохраняя при этом достаточную точность.
|
ID |
ФИО |
Должность |
Отдел |
|
1 |
Иванов Иван |
Менеджер |
Продажи |
|
2 |
Петров Пётр |
Специалист |
Разработка |
|
3 |
Миронов Мирон |
Руководитель |
Управление |
|
4 |
Фёдоров Фёдор |
Специалист |
Разработка |
|
ID |
ФИО |
Должность |
Отдел |
|
1 |
Иванов Иван |
Менеджер |
Продажи |
|
3 |
Миронов Мирон |
Руководитель |
Управление |
|
2 |
Петров Пётр |
Специалист |
Разработка |
|
4 |
Фёдоров Фёдор |
Специалист |
Разработка |