Теория нормализации

advertisement


устранение дублирования информации;
решение проблемы “присоединенных
записей”.
Почему дублирование информации – это
плохо?
 Лишний расход памяти.
 Проблемы с корректировкой данных.
Сотрудники
ТабельныйНом
ФИО
НомОтдела
НазОтдела
100
Иванов И.И
5
Отдел
маркетинга
101
Петров П.П.
2
Отдел кадров
105
Сидоров С.С.
5
Отдел
маркетинга
113
Новиков Н.Н.
2
Отдел кадров
128
Воробьев В.В.
2
Отдел кадров
Сотрудники
ТабельныйНом
ФИО
НомОтдела
НазОтдела
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
2
123-123
5
234-567
5
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 (ТабельныйНомер, ФИО, НомерОтдела)
Отделы (НомерОтдела, НазваниеОтдела)
Примечание: Обычно на практике достаточно
ограничиться таблицами в 3НФ, остальные
нормальные формы нарушаются редко и
представляют только теоретический
интерес.
Таблица находится в НФБК тогда и только тогда,
когда любая функциональная зависимость
сводится к полной функциональной
зависимости от первичного ключа (т.е., нет
функциональных зависимостей ключевых
полей от неключевых).
Пример нарушения НФБК: рассмотрим таблицу
(предполагается, что нет одинаковых городов):
Адреса (Индекс, Город, Улица)
Город функционально зависит от Индекс.
Разбивать такую таблицу на 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
1
5
31.10.14
01.11.14
1
2
10
03.11.14
03.11.14
1
3
…
…
…
…
…
Проверим таблицы на соответствие второй
нормальной форме. Нет ли зависимостей от
части первичного ключа?
 Команда(НомРейса, ФИО, ТабНомер, Должность)
 ТабНомер (J) ->ФИО,Должность (K)
Применим теорему Хита, получим 2 проекции:
 Сотрудники(ТабНомер, ФИО, Должность)
 Команда2(НомРейса, ТабНомер)
Проверим таблицы на соответствие второй нормальной
форме. Нет ли зависимостей от части первичного
ключа?
 ЗатратыНа Груз(НомГруза, ТипГруза, Вес, Объем,
Откуда, Куда, СрокДоставки, НомРейса, ТипЗатрат,
ЕдИзм, Цена, Колво)
 НомГруза (J) -> ТипГруза, Вес, Объем, Откуда, Куда,
СрокДоставки, НомРейса (K)
НомГорода
Применим теорему Хита, получим 2 проекции:
 Грузы(НомГруза, ТипГруза, Вес, Объем, Откуда, Куда,
СрокДоставки, НомРейса)
 ЗатратыНа Груз2(НомГруза, ТипЗатрат, ЕдИзм, Цена,
Колво)
Проверим таблицы на соответствие третьей
нормальной форме. Нет ли зависимостей неключевых
полей друг от друга?


Рейс(НомРейса, НазСудна, ПортСудна, Маршрут)
НазСудна (J) -> ПортСудна(K)
Применим теорему Хита, получим 2 проекции:
НомГорода


Судно(НазСудна, ПортСудна)
Рейс2(НомРейса, НазСудна)
Как выглядит модель при проектировании «с нуля»
Download