Понятие функциональной зависимости

Для устранения перечисленных аномалий необходима декомпозиция схемы базы данных, гарантирующая отсутствие потерь и сохраняющая зависимости. Сохранение зависимостей подразумевает выполнение исходного множества функциональных зависимостей на отношениях новой схемы.

Термин функциональная зависимость означает следующее: атрибут B отношения R функционально зависит от атрибута A того же отношения, если в каждый момент времени каждому значению атрибута A соответствует не более чем одно значение атрибута B, связанного с A в отношении R.

Утверждение, что B функционально зависит от A, означает то же самое, что A однозначно определяет B, т.е. если в какой-то момент времени известно значение A, то можно получить и значение B.

Атрибут может функционально зависеть не от какого-то одного атрибута, а от целой группы атрибутов. Атрибут (или набор атрибутов) B из отношения R называется полностью зависимым от другого набора атрибутов A отношения R, если B функционально зависит от всего множества A, но не зависит ни от какого подмножества A. Например, если и , то функциональная зависимость неполная.

2.4.2 Первая нормальная форма: атомарные атрибуты

Первая нормальная форма (1НФ) требует, чтобы каждое поле таблицы было неделимым и не содержало повторяющихся групп. Неделимость поля означает, что содержащиеся в нем значения не должны делиться на более мелкие части. Например, если в поле «Подразделение» содержится название факультета и кафедры, требование неделимости не соблюдается и необходимо выделить название факультета или кафедры в отдельное поле.

Повторяющимися являются поля, содержащие одинаковые по смыслу значения. Например, если требуется получить статистику продаж четырех товаров по месяцам, можно создать поля для хранения данных о продаже по каждому товару. Но что делать, если количество товаров не четыре, а 104, или если количество товаров заранее не известно? Повторяющиеся группы следует устранить, сохранив в таблице единственное поле «Товар». В результате получим запись, содержащую информацию о статистике продаж по одному товару, но этот товар может быть любым: для четырех товаров будем иметь четыре записи, а для 104 товаров − 104 записи.

Рассмотрим пример приведения к 1НФ. Пусть необходимо автоматизировать процесс отпуска товаров со склада по накладной, приведенной Рис. 2.12.

Рис. 2.12 - Накладная на отпуск товаров

Сначала сведем все имеющиеся в накладной данные в одну таблицу. Приводя ее к 1НФ, учтем, что впоследствии будет необходимо учитывать продажи по разным городам, поэтому из поля «Адрес» выделим часть данных (город) в отдельное поле «Город». Кроме того, известно, что каждый покупатель может закупить в один день различное количество товаров. Однако, чтобы не создавать повторяющихся групп, фиксируем факт отпуска каждого товара в отдельной записи. В результате получим таблицу «ОТПУСК ТОВАРОВ» (см. Рис. 2.13).

Итак, чтобы привести таблицу к 1НФ нужно выполнить следующие шаги:

1. Все значения полей необходимо привести к атомарному виду, выделив части сложных значений в отдельные поля.

2. Необходимо свести поля, одинаковые по смыслу в одно поле.

2.4.3 Вторая нормальная форма: отсутствие зависимостей частичного ключа

Следующий шаг в процессе нормализации состоит в удалении всех неключевых атрибутов, которые зависят только от части первичного ключа. Такие атрибуты называются частично зависимыми. Те поля, которые зависят только от части первичного ключа, должны быть выделены в отдельные таблицы. Для приведения к 2НФ в таблице «ОТПУСК ТОВАРОВ» выделим поля, потенциально входящие в первичный ключ. «Дата накладной», «Покупатель» и «Номер накладной» не могут однозначно определять запись, поскольку они будут одинаковыми для всех товаров, отпускаемых по одной накладной. Поэтому введем в первичный ключ еще и поле «Товар».

 
Номер накладной
Дата
Покупатель
Город
Адрес
Товар
Един_измер
Цена_за_ед_изм
Отпущ_единиц
Общая_стоим

 

Номер накладной
Товар
Дата
Покупатель
Город
Адрес
Един_измер
Цена_за_ед_изм
Отпущ_единиц
Общая_стоим

 

Товар
Един_измер
Цена_за_ед_изм

 

Номер накладной
Товар (FK)
Дата
Покупатель
Город
Адрес
Отпущ_единиц
Общая_стоим

 

Рис. 2.13 - Таблица «ОТПУСК ТОВАРОВ», приведенная к 1НФ Рис. 2.14 - Таблица «ОТПУСК ТОВАРОВ» с уточненным первичным ключом Рис. 2.15 - Таблицы «ТОВАР» и «ОТПУСК ТОВАРОВ»

Нетрудно увидеть, что созданный нами первичный ключ избыточен: поле «Номер накладной» однозначно определяет дату и покупателя. Для данной накладной не может быть иной даты и иного покупателя. А поле «Товар» в комбинации с полем «Номер накладной», напротив, однозначно идентифицирует запись. После уточнения состава первичного ключа получим новую таблицу «ОТПУСК ТОВАРОВ» (см. Рис. 2.14).

Первое требование 2НФ выполнено, чего не скажешь о втором. Некоторые поля зависят только от части первичного ключа. Поля «Ед_из­мер», «Цена_за_ед_измер» зависят от значения поля «Товар», но не зависят от значения поля «Номер накладной». Поэтому выделяем эти поля в таблицу «ТОВАР» и определяем связь 1:М между таблицами «ОТПУСК ТОВАРОВ» и «ТОВАР», так как один товар может присутствовать во многих накладных (см. Рис. 2.15).

Товар
Един_измер
Цена_за_ед_изм

 

Номер накладной
Товар (FK)
Дата
Отпущ_единиц
Общая_стоим

 

Покупатель
Город
Адрес

 

Рис. 2.16 - Таблицы «ТОВАР», «ОТПУСК ТОВАРОВ» и «ПОКУПАТЕЛИ»

Дальнейший анализ получен­ных таблиц показывает, что значения поля «Покупатель» не зависят от первичного ключа «Номер накладной» и «Товар», а зависит только от значения «Номер накладной». Поэто­му данное поле, и завися­щие от его значения поля «Город» и «Адрес» выделим в таблицу «ПОКУПАТЕЛИ» (см. Рис. 2.16).

Анализируя далее стру­к­туру таблицы «ОТПУСК ТОВАРОВ», обнаружим, что поле «Дата» зависит только от значения поля «Номер накладной». Поэтому выделяем поля «Дата» и «Номер накладной» в самостоятельную таб­лицу «НАКЛАДНЫЕ». Установим связи между этими табли­цами. Один покупатель может встретиться во многих накладных. Поэтому между таблицами «ПОКУПАТЕЛИ» и «НАКЛАДНЫЕ» имеется связь 1:М по полю «Покупатель». Одной накладной может соответствовать несколько товаров. Поэтому между таблицами «НАКЛАД­НЫЕ» и «ОТПУСК ТОВАРОВ» установим связь 1:М по полю «Номер накладной». В итоге получим схему базы данных, приведенную на Рис. 2.17.

Итак, чтобы перейти от 1НФ к 2НФ, нужно выполнить следующие шаги:

1. Определить, на какие части можно разбить первичный ключ так, чтобы некоторые из неключевых полей зависели от одной из этих частей.

2. Создать новую таблицу для каждой части ключа и группы зависящих от нее полей и переместить их в эту таблицу. Часть бывшего первичного ключа при этом станет первичным ключом новой таблицы.

Рис. 2.17 - База данных, приведенная к 2НФ

3. Удалить из исходной таблицы поля, перемещенные в другие таблицы, кроме тех из них, которые станут вторичными ключами.

2.4.4 Третья нормальная форма: Устранение транзитивных зависимостей

Третья нормальная форма (3НФ) требует, чтобы в таблице не имелось транзитивных зависимостей между неключевыми полями, т.е. чтобы значение любого поля, не входящего в первичный ключ, не зависело от другого поля, также не входящего в первичный ключ.

Пусть A, B, C − три атрибута или три набора атрибутов отношения R. Если C зависит от B, а B − от A, то C зависит от A. Если при этом обратное соответствие неоднозначно (т.е. A не зависит от B, или B не зависит от C), то говорят, что C транзитивно зависит от A.

В нашем примере можно увидеть, что в таблице «ОТПУСК ТОВАРОВ» имеется зависимость значения поля «Общая стоимость» от значения поля «Отпущено единиц». Поэтому поле «Общая стоимость» из таблицы «ОТПУСК ТОВАРОВ» удаляем. Следует отметить, что здесь рассматривается частный случай правила приведения к 3НФ, так как удаляемое поле является вычисляемым. Схема базы данных, приведенной к 3НФ показана на Рис. 2.18.

Рис. 2.18 - Нормализованная база данных, приведенная к 3НФ

Переход от 2НФ к 3НФ в соответствии с общим правилом содержит следующие шаги:

1. Определить поля (или группы полей), от которых зависят другие поля.

2. Создать новую таблицу для каждого такого поля (или группы полей) и группы зависящих от него полей и переместить их в эту таблицу. Поле, от которого зависят все остальные перемещенные поля, станет при этом первичным ключом новой таблицы.

3. Удалить перемещенные поля из исходной таблицы, оставив лишь те из них, которые станут вторичными ключами.








Дата добавления: 2015-02-03; просмотров: 1328;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.