Транзитивная функциональная зависимость
Для изучения третьей нормальной формы рассмотрим понятие транзитивной функциональной зависимости.
Пусть a,b,c – атрибуты некоторого отношения, причем a→b и b→c, но обратного соответствия нет (c↛b и b↛a). Тогда c транзитивно зависит от a.
Рассмотрим пример.
Пусть существует отношение ХРАНИЛИЩЕ, которое содержит атрибуты Организация, Склад, Объемы и хранит информацию об организациях, которые получают товары со складов, и об объемах складов. Ключевым является атрибут Организация. Если каждая организация может получить товар лишь с одного склада, то данное отношение имеет такие функциональные зависимости:
- Организация → Склад;
- Склад → Объемы.
В таком случае возникают аномалии:
- если ни одна организация в данный момент не получает со склада товар, то в базу данных невозможно ввести информацию о его объеме (поскольку ключевой атрибут не определен);
- если объем склада изменился, необходимо просмотреть все отношение и изменение кортежей для всех организаций, которые связаны с указанным складом.
Во избежание таких ситуаций нужно разбить на два исходное отношение:
- ХРАНИЛИЩЕ (Организация, Склад);
- ОБЪЕМЫ_СКЛАДА (Склад, Объемы).
Третья нормальная форма
Отношение находится в третьей нормальной форме (3NF, 3НФ), когда оно находится во второй нормальной форме и каждый неключевой атрибут состоит в нетранзитивной зависимости от первичного ключа.
То есть, если существует отношение R(k,a,b), которое находится во второй нормальной форме, где k является первичным ключом, а a и b – неключевыми атрибутами отношения R, и существуют функциональные зависимости: k→a,
a→b,
то атрибут b состоит в транзитивной зависимости от k.
Чтобы привести отношение $R4 к третьей нормальной форме его нужно декомпозировать на 2 отношения:R4 к третьей нормальной форме его нужно декомпозировать на 2 отношения:
R1(k,a) и R2(a,b).
Между отношениями R1 и R2 будет связь «многие-к-одному» по атрибуту a.
Пусть существует отношение Группы (Номер_группы, Название_специальности, Факультет) и имеет первичным ключ Номер_группы.
Специальность однозначно определяется атрибутом Номер_группы, а факультет однозначно определяется атрибутом Название_специальности.
Таким образом, имеются такие функциональные зависимости:
- Номер_группы → Название_специальности (Название_специальности ↛ Номер_группы);
- Название_специальности → Факультет (Факультет ↛ Название_специальности).
Если исключить транзитивную функциональную зависимость, будем иметь отношения:
- Группы (Номер_группы, Название_специальности);
- Специальности (Название_специальности, Факультет).
Рассмотрим еще один пример.
Пусть база данных содержит следующие отношения:
ПРЕПОДАВАТЕЛИ (Табельн_номер, ФИО, Должность);
СТУДЕНТЫ (Зачетн_книжка, ФИО, Тема_диплома);
КОНСУЛЬТАЦИИ (Табельн_номер, Зачетн_книжка, Дата, Номер_ауд, Число_мест).
Отношение КОНСУЛЬТАЦИИ содержит транзитивную зависимость:
(Табельн_номер, Зачетн_книжка, Дата) → Номер_ауд → Число_мест.
Таким образом, отношение КОНСУЛЬТАЦИИ не находится в третьей нормальной форме, вследствие чего может произойти следующее:
- если аудиторию исключить из расписания консультаций, то сведения о ней совсем потеряются;
- если аудиторию перестроить, в результате чего изменится ее вместимость, то необходимо будет выполнить просмотр всех кортежей и изменить значения атрибута.
Чтобы устранить транзитивную зависимость нужно декомпозировать последнее отношение, выполнив удаление из него транзитивно зависимого атрибута, и перенести его в новое отношение с копией атрибута, от которого он зависит.
База данных без транзитивных зависимостей в третьей нормальной форме будет иметь вид:
ПРЕПОДАВАТЕЛИ (Табельн_номер, ФИО, Должность);
СТУДЕНТЫ (Зачетн_книжка, ФИО, Тема_диплома);
КОНСУЛЬТАЦИИ (Табельн_номер, Зачетн_книжка, Дата, Номер_ауд);
АУДИТОРИИ (Номер_ауд, Число_мест).
В процессе проектирования структуры реляционной БД принято создавать БД как минимум в третьей нормальной форме. Если реляционная база данных приведена к третьей нормальной форме, то процесс ее проектирования обычно заканчивается.