
Лекция 10. Нормализация отношений (часть 1).
План лекции
-
Определение нормализации.
-
Универсальное отношение.
-
Проблемы, вызванные использованием универсального отношения: вставки, обновления, удаления.
-
Виды нормальных форм.
-
Определение первой нормальной формы.
-
Функциональные зависимости .
-
Полная функциональная зависимость.
-
Определение второй нормальной формы.
-
Транзитивная зависимость.
-
Определение третьей нормальной формы.
-
Примеры нормализации.
Нормализация – разбиение одного отношения на два или более, в соответствии со специальной процедурой.
Разработчик БД должен обнаруживать потенциально опасные отношения и нормализовать их.
Универсальное отношение.
Рассмотрим пример.
Необходимо разработать БД для библиотеки.
Обозначения:
СНОМ – номер сотрудника.
СФАМ – фамилия сотрудника.
ЛНОМ – номер лаборатории.
ТНОМ – номер телефона лаборатории.
ШКН – шифр книги.
ДАТА – дата сдачи книги в библиотеку.
СТКН – стоимость книги.
Замечания:
-
сотрудник находится в одной лаборатории,
-
в одной лаборатории работает несколько сотрудников;
-
в лаборатории имеется только один телефон.
Таблица 14 Читатель
СНОМ |
СФАМ |
ЛНОМ |
ТНОМ |
ШКН |
ДАТА |
СТКН |
|
3215
|
Иванов
|
120
|
2136
|
122 120 230 |
Д1 Д2 Д3 |
90,00 70,00 55,00 |
|
3462
|
Петров
|
238
|
2344
|
122 123 |
Д1 Д2 |
90,00 85,50 |
|
3567
|
Сидоров
|
120
|
2136
|
239 141 |
Д1 Д2 |
150,00 120,00 |
|
4735 |
Николаев |
345 |
3321 |
398 |
Д1 |
40,00 |
Данная таблица не является нормализованным отношением. Почему?
Выделим первую строку: СНОМ=3215. Значение четырех полей СНОМ, СФАМ, ЛНОМ, ТНОМ являются атомарными (неделимыми), в то время как значения в полях ШКН, ДАТА, СТКН множественные.
Преобразуем эту таблицу так, чтобы каждый элемент в строке имел атомарное значение. Это достигается с помощью простого процесса вставки недостающих (избыточных) значений.
Таблица 14 Читатель
СНОМ |
СФАМ |
ЛНОМ |
ТНОМ |
ШКН |
ДАТА |
СТКН |
3215 3215 3215 |
Иванов Иванов Иванов |
120 120 120 |
2136 2136 2136 |
122 120 230 |
Д1 Д2 Д3 |
90,00 70,00 55,00 |
3462 3462 |
Петров Петров |
238 238 |
2344 2344 |
122 123 |
Д1 Д2 |
90,00 85,50 |
3567 3567 |
Сидоров Сидоров |
120 120 |
2136 2136 |
239 141 |
Д1 Д2 |
150,00 120,00 |
4735 |
Николаев |
345 |
3321 |
398 |
Д1 |
40,00 |
Эта таблица представляет собой экземпляр корректного отношения, которое называется универсальным отношением. В эту таблицу включены все нужные атрибуты.
Проблемы, вызванные использованием универсального отношения
Вопрос: зачем необходимо разбивать отношение ЧИТАТЕЛЬ на более мелкие отношения, если оно содержит в себе все необходимые данные?
Проблема вставки. Если в библиотеку записался новый сотрудник, еще не взявший ни одной книги, то для него необходимо включить в табл. кортеж с пустыми значениями атрибутов ШКН, ДАТА, СТКН.
Таблица оказывается частично заполненной – лишний объем памяти.
Проблема обновления (модификации).
Явная избыточность. СФАМ, ЛНОМ, ТНОМ появляются в таблице многократно. Если Иванов перешел в другую лабораторию, то библиотекарь будет вынужден проследить изменение номера лаборатории и телефона во всех строках.
Неявная избыточность. Один и тот же номер телефона имеют сотрудники в одной лаборатории: Иванов и Сидоров.
Пусть Иванов извещает библиотекаря о том, что его номер телефона изменился на 7777, забыв при этом сообщить, что у его соседа (Сидорова) так же изменился номер.
Если библиотекарь изменит номер только у Иванова, то лаборатории 120 будут соответствовать уже 2 телефона.
Проблема удаления. В отношении ЧИТАТЕЛЬ присутствует 1 кортеж СНОМ=4735.
Предположим, что библиотекарь узнает, что книга, которая числится за Николаевым, сдана и находится в библиотеке. Он удаляет этот кортеж. Но, ликвидируя задолженность, он удаляет данные о сотруднике.
Виды нормальных форм Определение первой нормальной формы (1нф)
Отношение находится в 1НФ, если каждый его элемент имеет и будет иметь всегда атомарное значение, т.е. на пересечение столбца и строки таблицы может быть только одно значение. Существование повторяющихся групп значений не допускается.
Например, атрибут Адрес, содержащий не только название улицы, но и название города, страны и почтовый адрес, атомарным не является. Такие атрибуты нужно разбить на ряд атрибутов, для того чтобы таблица полностью соответствовала первой нормальной форме.
Повторяющаяся группа – это однотипные атрибуты , которые повторяются в пределах одной сущности или же столбцы повторяющиеся в пределах одной таблицы. Они могут использоваться для хранения нескольких значений одного и того же атрибута.
Например, у человека может быть несколько телефонов и для хранения их номеров мы создаем в сущности ряд однотипных атрибутов: Телефон1, Телефон2, Телефон3 и т. д.
Аналогично у сотрудника может быть несколько детей и поэтому мы создадим сущность с атрибутами: Ребенок1, Ребенок2, …. Именно эти дополнительные столбцы называются повторяющейся группой.
Нарисуйте таблицу, которая будет содержать несколько однотипных столбцов и попытайтесь заполнить ее данными. Через некоторое время вы обнаружите, что в некоторых строках все поля будет заполнены, а в других стоках они заполнены частично. Может оказаться, что полей не хватает. Например, для регистрации детей создано три атрибута, а фактически детей четверо. Как зафиксировать в БД четвертого ребенка? Можно, например, изменить структуру таблицы, а также приложений, которые обращаются к этой таблице.
Если вы обнаружили в отношении повторяющуюся группу, то перенесите эти атрибуты в отдельную сущность!
Рис.1 . Исходная сущность
Нормализуем отношение. Извлекаем данные о телефонах и помещаем их в отдельную сущность, Эта сущность становится подчиненной.
Рис. 2. Неидентифицирующее отношение
В дочерней сущности для каждого сотрудника может быть несколько записей, т.е. дополнительные столбцы в исходной таблице трансформируются в дополнительные записи в дочерней таблице.
Рис. 3. Идентифицирующее отношение
Функциональные зависимости (ФЗ). При нормализации данных необходимо использовать концепцию функциональных зависимостей между атрибутами универсального отношения.
Если даны два атрибута X и Y, то говорят, что Y функционально зависит от X, если для каждого значения X существует ровно 1 связанное с ним значение Y в любой момент времени.
X и Y могут быть составными, т.е. они могут представлять не единичные атрибуты, а группы состоящие из двух или более атрибутов.
Обозначения ФЗ:
X
Y
или
Найдем в отношении читатель ФЗ.
СНОМ СФАМ
СНОМ ЛНОМ
СНОМ ТНОМ
ЛНОМ ТНОМ
ТНОМ ЛНОМ
ШКН СТКН
ДАТА не имеет функциональной зависимости с другими атрибутами.
Полная
ФЗ. Атрибут
Y
находится в полной ФЗ от атрибута X,
если он функционально зависит от X
и не зависит функционально от любого
подмножества X.
Это определение применяется в том случае, если X – составной атрибут.
Рассмотрим отношение «Поставщик_ Поставка»
Обозначения:
ПОСТ – поставщик
СТ – статус поставщика
ГОР – город
ПКА – поставка
КВО – количество
Таблица 15 Поставщик_ Поставка
-
ПОСТ #
СТ
ГОР
ПКА #
КВО
П1
П1
П1
П1
П1
П1
П2
П2
П3
П4
П4
П4
20
20
20
20
20
20
10
10
10
20
20
20
Лондон
Лондон
Лондон
Лондон
Лондон
Лондон
Париж
Париж
Париж
Лондон
Лондон
Лондон
ПО1
ПО2
ПО3
ПО4
ПО5
ПО6
ПО1
ПО2
ПО2
ПО2
ПО4
ПО5
300
200
400
200
100
100
500
400
400
150
120
110
Просматривая это отношение выделим ФЗ:
ПОСТ СТ
ПОСТ ГОР
ГОР СТ
СТ ГОР
ПКА – не имеет ФЗ
ПОСТ, ПКА КВО полная ФЗ.
Рис.4. Пример полной функциональной зависимости
Рассмотрим проблемы универсального отношения.
Вставка:
Не можем включить поставщика П5 находящегося в г. Афины. Причина поле ПОСТ является частью первичного ключа не указав второй части не можем записать в кортеж.
Удаление:
Если удаляем един. кортеж П3 и ПО2, то теряем информацию о поставщике.
Обновление:
Если поставщик меняет адрес, то нужно менять этот адрес в нескольких записях.
Решить эти проблемы можно разбиением одного отношения на два: первое- Поставщик, второе – Поставка, т.е. выделить атрибуты зависящие от части первичного ключа в другое отношение.
Рис.5. Пример разделения таблицы универсального отношения
Рис.6. Разделение рисунка
Поясним преимущества разбиения на 2 отношения.
-
Вставка. Поставщик П5 добавлен отдельным кортежем, в отношение поставщик. Эта вставка может быть осуществлена и в том случае, если поставщик П5 не поставил поставок.
-
Обновление. Исходные данные о поставщике появляются в отношении поставщик один раз.
-
Удаление. Мы можем удалить любую поставку, но сведения при этом о поставщике сохраняются.