устранение дублирования информации; решение проблемы “присоединенных записей”. Почему дублирование информации – это плохо? Лишний расход памяти. Проблемы с корректировкой данных. Сотрудники ТабельныйНом ФИО НомОтдела НазОтдела 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(НомРейса, НазСудна) Как выглядит модель при проектировании «с нуля»