Нормализация таблиц реляционной базы данных © Панова И.В
Нормализация - это формальный аппарат ограничений на формирование таблиц, который позволяет устранить дублирование, обеспечивает непротиворечивость хранимых данных и уменьшает трудозатраты на ведение базы данных. Для каждой ступени нормализации имеются наборы ограничений, которым должны удовлетворять отношения БД (удаляется из таблиц базы избыточная неключевая информация) На каждой ступени этого процесса схемы отношений приводятся в нормальные формы (всего шесть) Процесс нормализации заключается в разложении (декомпозиции) исходных отношений БД на более простые отношения
Обеспечить быстрый доступ к данным Исключить ненужное повторение данных, которое может являться причиной ошибок при вводе, а также привести к нерациональному использованию дискового пространства. Обеспечить целостность данных, т.е. чтобы при изменении одних объектов автоматически происходило соответствующее изменение связанных с ними объектов. Окончательная цель нормализации- получение такого проекта базы данных, в котором каждый факт появляется лишь в одном месте
Первая нормальная форма ( First Normal Form 1NF ) Вторая нормальная форма ( Second Normal Form 2NF ) Третья нормальная форма ( Third Normal Form 3NF ) Нормальная форма Бойса-Кодда ( Brice-Codd Normal Form – BCNF ) Четвертая нормальная форма ( Fourth Normal Form - 4NF ) Пятая нормальная форма -нормальная форма проекции-соединения ( Fifth Normal Form - 5NF, или PJ/NF ) Каждая последующая форма должна отвечать требованиям предыдущей плюс некоторые дополнительные требования
При описании нормальных форм используются следующие понятия: функциональная зависимость между полями полная функциональная зависимость между полями многозначная функциональная зависимость между полями транзитивная функциональная зависимость между полями взаимная независимость между полями
Функциональной зависимостью между полями А и В называется зависимость, при которой каждому значению А в любой момент времени соответствует единственное значение В из всех возможных. Полной функциональной зависимостью между составным полем А и полем В называется зависимость, при которой поле В зависит функционально от всего поля A и не зависит функционально от любого подмножества поля А. Многозначная функциональная зависимость между полями определяется следующим образом: поле А многозначно определяет поле В, если для каждого значения поля А существует «хорошо определенное множество» соответствующих значений поля В. Транзитивная функциональная зависимость между полями А и С существует в том случае, если поле С функционально зависит от поля В, а поле В функционально зависит от поля А, при этом не существует функциональной зависимости поля А от поля В. Взаимная независимость между полями определяется следующим образом: несколько полей взаимно независимы, если ни одно из них не является функционально зависимым от другого.
Таблица находится в первой нормальной форме тогда и только тогда, когда ни одна из ее строк не содержит в любом своем поле более одного значения и ни одно из ее ключевых полей не пусто. Таблица, находящаяся в 1НФ, должна отвечать следующим требованиям: Таблица не должна иметь повторяющихся записей В таблице должны отсутствовать повторяющиеся группы полей Любая таблица в реляционной базе данных автоматически находится в первой нормальной форме (по определению). В такой таблице не должно содержаться полей, которые можно было бы разделить на несколько полей.
1)Определить поле, которое можно назначить первичным ключом. Если такого поля нет, то добавить уникальное ключевое поле 2)Определить группы повторяющихся полей 3)Вынести группы повторяющихся полей в отдельные таблицы, в основной таблице остается только одно поле для организации связи между таблицами 4)Назначить первичные ключи в новых таблицах 5)Определить тип отношения между таблицами
Пусть дана однотабличная БД «Заказы»: Дата заказа ФИО клиента Телефон клиента Номер счета Наименование товара Цена товара Фирма производитель Адрес фирмы производителя Количество товара Оплата товара Таблица не удовлетворяет требованиям 1НФ Не определён первичный ключ Содержит повторяющиеся группы полей: ФИО клиента и Телефон клиента
Дата заказа ФИО клиента Контактный телефон Номер счета Наименование товара Цена Фирма производитель Адрес фирмы производителя Количество товара Оплата Таблица «Клиенты» Код клиента ФИО клиента Контактный телефон Номер счета Таблица «Товары» Код товара Наименование товара Цена Таблица «Производители» Код производителя Фирма производитель Адрес фирмы производителя Таблица «Заказы» Код заказа Дата заказа Количество товара Оплата Приведение БД к 1НФ
Таблица «Заказы» Код заказа Дата заказа Количество товара Оплата Код клиента Код товара Таблица «Клиенты» Код клиента ФИО клиента Контактный телефон Номер счета Таблица «Товары» Код товара Наименование товара Цена Код производителя Таблица «Производители» Код производителя Фирма производитель Адрес фирмы производителя 1 М 1 М 1 М Определяем связи
Таблица находится во второй нормальной форме, если она удовлетворяет определению 1НФ и все ее поля, не входящие в первичный ключ, связаны полной функциональной зависимостью с первичным ключом (каждый неключевой атрибут зависит от всего составного ключа и не зависит от его частей – нет частично зависимых полей). Для приведения таблицы к 2НФ необходимо: 1. Вынести все частично-зависимые поля в отдельную таблицу 2. Определить ключевое поле 3. Установить отношения между таблицами
Код проекта Название Основная цель Продолжительность Код руководителя проекта Фамилия руководителя Телефон руководителя Пример: таблица «Проекты» Составной ключ Код проекта Код руководителя проекта Есть ли в таблице частично-зависимые поля? Название Основная цель Продолжительность Код проекта Код руководителя Фамилия руководителя Телефон руководителя
Таблица «Проекты» Таблица «Руководители» Код проекта Название Основная цель Продолжительность Код руководителя Фамилия руководителя Телефон руководителя 1 м
Таблица находится в третьей нормальной форме, если она удовлетворяет определению 2НФ и ни один из ее атрибутов функционально независим от любого другого атрибута. Таблица в 3НФ: должна отвечать требованиям 2НФ все не ключевые атрибуты взаимно независимы (нет полей, не зависящих от ключа) Алгоритм приведения к 3НФ: 1. Вынести все поля, не зависящие от ключа, в отдельную таблицу 2. Определить ключевые поля 3. Установить отношения
Таблица «Заказы» Код заказа Фамилия покупателя Дата продажи Код менеджера Фамилия менеджера Таблица «Заказы» Код заказа Фамилия покупателя Дата продажи Код менеджера Таблица «Менеджеры» Код менеджера Фамилия менеджера 1 м Таблица не находится в 3НФ: поле Фамилия менеджера зависит от поля Код менеджера
ЗАДАНИЕ: Дана таблица Предметы (Код предмета, Название, Цикл, Объем часов, Преподаватели) Необходимо последовательно привести её к 1НФ, 2НФ и 3НФ. Приведение таблицы к 1 НФ ПРЕДМЕТ ( Код предмета, Название, Цикл, Объем часов) ПРЕПОДАВАТЕЛЬ ( Код преподавателя, ФИО, Должность, Контакты, Код предмета) ПРЕДМЕТ ( Код предмета, Название, Цикл, Объем часов) ПРЕПОДАВАТЕЛЬ ( Код преподавателя, ФИО, Должность, Оклад, Контакты) ИЗУЧЕНИЕ ( Код предмета, Код преподавателя) Приведение таблицы к 2НФ ПРЕДМЕТ ( Код предмета, Название, Объем часов, Код цикла) ЦИКЛ ( Код цикла, Название цикла) ПРЕПОДАВАТЕЛЬ ( Код преподавателя, ФИО, Должность, Оклад, Контакты) ИЗУЧЕНИЕ ( Код предмета, Код преподавателя) ПРЕДМЕТ ( Код предмета, Название, Объем часов, Код цикла) ЦИКЛ ( Код цикла, Название цикла) ПРЕПОДАВАТЕЛЬ ( Код преподавателя, ФИО, Код должности, Контакты) ДОЛЖНОСТЬ ( Код должности, Название должности, Оклад) ИЗУЧЕНИЕ ( Код предмета, Код преподавателя) Приведение таблицы к 3НФ 1НФ 2НФ 3НФ