устранение дублирования информации;
решение проблемы “присоединенных записей”.
Почему дублирование информации – это плохо?
Лишний расход памяти.
Проблемы с корректировкой данных.
Цели теории нормализации:
Дублирование информации
ТабельныйНом | ФИО | НомОтдела | НазОтдела |
100 | Иванов И.И | 5 | Отдел маркетинга |
101 | Петров П.П. | 2 | Отдел кадров |
105 | Сидоров С.С. | 5 | Отдел маркетинга |
113 | Новиков Н.Н. | 2 | Отдел кадров |
128 | Воробьев В.В. |
Сотрудники
«Присоединенные» записи
ТабельныйНом | ФИО | НомОтдела | НазОтдела |
100 | Иванов И.И | 5 | Отдел маркетинга |
101 | Петров П.П. | 2 | Отдел кадров |
105 | Сидоров С.С. | 5 | Отдел маркетинга |
Сотрудники
Пусть требуется добавить новый отдел с номером 10 и названием «Отдел логистики». Как это сделать в
текущей таблице?
Таблицу «Сотрудники» следует разбить на 2 проекции:
Сотрудники2(ТабельныйНом, ФИО, НомОтдела)
Отдел (НомОтдела, НазОтдела)
Если к этим проекциям применить операцию join, то получим исходную таблицу.
Полная декомпозиция таблицы – это набор произвольного числа ее проекций, соединение которых идентично исходной таблице.
Процесс нормализации заключается в переходе от исходной таблицы к ее полной декомпозиции вплоть до получения таблиц в пятой нормальной
форме.
Полная декомпозиция
Таблица находится в 1НФ тогда и только тогда, когда в каждом ее поле (на пересечении строки и столбца) находится ровно одно значение (не более одного и не ноль значений).
Специально для выполнения этого требования придумано значение NULL.
Пример нарушения 1НФ: в поле НомерТелефона указано несколько номеров через запятую.
Первая нормальная форма
Первая нормальная форма
НомОтдела | НазОтдела | НомерТелефона |
2 | Отдел маркетинга | 111-111, 123-123 |
5 | Отдел кадров | 234-567, 222-333 |
Что делать? Создать новую таблицу для многозначного атрибута, в которую нужно добавить исходный первичный ключ
НомОтдела | НазОтдела |
2 | Отдел маркетинга |
5 | Отдел кадров |
НомОтдела | НомерТелефона |
2 | 111-111 |
123-123 | |
5 | 234-567 |
222-333 |
Пусть X и Y – списки полей таблицы. Говорят, что Y функционально зависит от X, если каждому значению X соответствует единственное значение Y. Обозначают X->Y.
Любое неключевое поле функционально зависит от первичного ключа!
Функциональная зависимость
Пусть X и Y – списки полей таблицы. Говорят, что Y находится в полной функциональной зависимости от X, если:
Y функционально зависит от X;
Y функционально не зависит ни от какого подмножества X, не совпадающего с X.
Заказы (НомерЗаказа, НомерТовара, ОписаниеТовара, Количество)
Поле «ОписаниеТовара» зависит от части ключа «НомерТовара», т.е., не находится в полной функциональной зависимости от первичного ключа таблицы.
Полная функциональная зависимость
Таблица находится в 2НФ тогда и только тогда, когда каждое неключевое поле таблицы связано полной функциональной зависимостью с первичным ключом.
Пример нарушения 2НФ: рассмотрим таблицу:
Заказы (НомерЗаказа, НомерТовара, ОписаниеТовара, Количество)
Поле «ОписаниеТовара» зависит от части ключа «НомерТовара», т.е., не находится в полной функциональной зависимости от первичного ключа таблицы, требования 2НФ нарушаются.
Что делать?
Вторая нормальная форма
Теорема Хита (устанавливает связь между функциональной зависимостью и полной декомпозицией таблицы).
Пусть список столбцов таблицы разбит на 3 непересекающиеся части: H, J, K. Если K функционально зависит от J, то выполняется утверждение:
Таблица =
proj H, J (Таблица)
join
proj J, K (Таблица)
Теорема Хита
Заказы (НомерЗаказа, НомерТовара, ОписаниеТовара, Количество)
Поле «ОписаниеТовара» зависит от части ключа «НомерТовара».
Положим J=«НомерТовара», K= «ОписаниеТовара», H=остальные столбцы, применим теорему Хита. Получим 2 проекции:
Заказы2 (НомерЗаказа, НомерТовара, Количество)
Товары(НомерТовара, ОписаниеТовара,)
Вторая нормальная форма
Таблица находится в 3НФ тогда и только тогда, когда она находится во 2НФ, и не существует функциональных зависимостей между неключевыми полями.
Пример нарушения 3НФ: рассмотрим таблицу:
Сотрудники (ТабельныйНомер, ФИО,
НомерОтдела, НазваниеОтдела)
НазваниеОтдела функционально зависит от НомерОтдела т.е, от неключевого поля. Такие зависимости называются транзитивными. Применяя теорему Хита, разобьем эту таблицу на 2 проекции:
Сотрудники2 (ТабельныйНомер, ФИО, НомерОтдела)
Отделы (НомерОтдела, НазваниеОтдела)
Третья нормальная форма
Процесс нормализации – когда остановиться?
Таблица находится в НФБК тогда и только тогда, когда любая функциональная зависимость сводится к полной функциональной зависимости от первичного ключа (т.е., нет функциональных зависимостей ключевых полей от неключевых).
Пример нарушения НФБК: рассмотрим таблицу (предполагается, что нет одинаковых городов):
Адреса (Индекс, Город, Улица)
Город функционально зависит от Индекс.
Разбивать такую таблицу на 2 проекции не стоит. Лучше смириться с таким нарушением.
Нормальная форма Бойса-Кодда
Таблица находится в 4НФ тогда и только тогда, когда в каждой ее полной декомпозиции, состоящей из двух проекций, каждая проекция содержит первичный ключ исходной таблицы.
Пример нарушения 4НФ: рассмотрим таблицу Сотрудник
Четвертая нормальная форма
ФИО | ИнострЯзык | ИмяРебенка |
Смит | Немецкий | Джон |
Мэри | ||
Русский | Джон | |
Мэри |
Это нарушение происходит из-за того, что два множественных атрибута объекта (т.е., такие атрибуты, которых у каждого объекта может быть несколько) поместили в одну и ту же таблицу, в то время как для каждого множественного свойства нужно создавать отдельную таблицу
Исходную таблицу нужно разбить на две проекции:
Четвертая нормальная форма
ФИО | ИнострЯзык |
Смит | Русский |
Немецкий |
ФИО | ИмяРебенка |
Смит | Джон |
Мэри |
Таблица находится в 5НФ тогда и только тогда, когда в каждой ее полной декомпозиции каждая проекция содержит первичный ключ исходной таблицы.
Пятая нормальная форма
Грузовая судоходная компания занимается перевозкой грузов по реке. В распоряжении компании есть несколько судов, каждое судно приписано к какому-то городу.
Необходимо хранить информацию о произведенных рейсах, маршрутах рейсов, составе судовых экипажей, перевезенных грузах и дополнительных затратах на перевозку (погрузка, разгрузка и т.п.)
Для каждого груза нужно хранить номер груза, тип груза, вес, объем, из какого города и в какой город он перевозится, срок доставки.
Дополнительные затраты характеризуются названием, единицей измерения (например, человеко-часы для грузчиков или квадратные метры упаковочного материала), ценой и количеством.
Пример процесса нормализации
Один из сотрудников (боцман) предложил следующую модель для хранения информации о работе компании:
Рейс(НомРейса, НазСудна, ПортСудна, Маршрут)
Команда(НомРейса, ФИО, ТабНомер, Должность)
ЗатратыНа Груз(НомГруза, ТипГруза, Вес, Объем, Откуда, Куда, СрокДоставки, НомРейса, ТипЗатрат, ЕдИзм, Цена, Колво)
При этом в ячейке «Маршрут» содержатся примерно такие данные:
«Казань, 30.10.14; Ульяновск, 31.10.14-01.11.14; Саратов, 03.11.14-03.11.14, . . .»
Пример процесса нормализации
Посмотрим, нет ли в нашей модели каких-либо объектов- или атрибутов-синонимов.
Столбцы «ПортСудна», «Откуда», «Куда» и названия городов в маршруте – это одинаковые данные, из них можно сделать таблицу:
Города(НомГорода, НазГорода)
Лингвистические отношения
НомГорода | НазГорода |
1 | Казань |
5 | Ульяновск |
10 | Саратов |
В ячейке «Маршрут» нарушается первая нормальная форма:
«Казань, 30.10.14; Ульяновск, 31.10.14-01.11.14; Саратов, 03.11.14-03.11.14, . . .»
Создадим таблицу «Маршрут»:
Первая нормальная форма
НомГорода | ДатаПрибытия | ДатаОтбытия | НомРейса | НомПунктаВ |
1 | 30.10.14 | 1 | ||
5 | 31.10.14 | 01.11.14 | 2 | |
10 | 03.11.14 | 3 | ||
… |
Проверим таблицы на соответствие второй нормальной форме. Нет ли зависимостей от части первичного ключа?
Команда(НомРейса, ФИО, ТабНомер, Должность)
ТабНомер (J) ->ФИО,Должность (K)
Применим теорему Хита, получим 2 проекции:
Сотрудники(ТабНомер, ФИО, Должность)
Команда2(НомРейса, ТабНомер)
Вторая нормальная форма
Проверим таблицы на соответствие второй нормальной форме. Нет ли зависимостей от части первичного ключа?
ЗатратыНа Груз(НомГруза, ТипГруза, Вес, Объем, Откуда, Куда, СрокДоставки, НомРейса, ТипЗатрат, ЕдИзм, Цена, Колво)
НомГруза (J) -> ТипГруза, Вес, Объем, Откуда, Куда, СрокДоставки, НомРейса (K)
Применим теорему Хита, получим 2 проекции:
Грузы(НомГруза, ТипГруза, Вес, Объем, Откуда, Куда, СрокДоставки, НомРейса)
ЗатратыНа Груз2(НомГруза, ТипЗатрат, ЕдИзм, Цена, Колво)
Вторая нормальная форма
НомГорода |
Проверим таблицы на соответствие третьей нормальной форме. Нет ли зависимостей неключевых полей друг от друга?
Рейс(НомРейса, НазСудна, ПортСудна, Маршрут)
НазСудна (J) -> ПортСудна(K)
Применим теорему Хита, получим 2 проекции:
Судно(НазСудна, ПортСудна)
Рейс2(НомРейса, НазСудна)
Третья нормальная форма
НомГорода |
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.