Многозначные зависимости и четвертая нормальная форма (4NF)

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

Многозначная зависимость является обобщением функциональной зависимости и рассматривает соответствия между множествами значений атрибутов.

В качестве примера рассмотрим отношение ПРЕПОДАВАТЕЛЬ (ИМЯ, КУРС, УЧЕБНОЕ_ПОСОБИЕ), хранящее сведения о курсах, читаемых преодавателем, и написанных им учебниках. Пусть профессор N читает курсы "Теория упругости" и "Теория колебаний" и имеет соответствующие учебные пособия, а профессор K читает курс "Теория удара" и является автором учебников "Теория удара" и "Теоретическая механика". Тогда наше отношение будет иметь вид:

----------------------------------------------------

| ИМЯ | КУРС | УЧЕБНОЕ_ПОСОБИЕ |

----------------------------------------------------

| N | Теория упругости | Теория упругости |

| N | Теория колебаний | Теория упругости |

| N | Теория упругости | Теория колебаний |

| N | Теория колебаний | Теория колебаний |

| K | Теория удара | Теория удара |

| K | Теория удара | Теоретическая механика |

----------------------------------------------------

добавляем:

----------------------------------------------------

| K | Теория упругости | Теория удара |

| K | Теория упругости | Теоретическая механика |

----------------------------------------------------

Это отношение имеет значительную избыточность и его использование приводит к возникновению аномалии обновления. Например, добавление информации о том, что профессор K будет также читать лекции по курсу "Теория упругости" приводит к необходимости добавить два кортежа (по одному для каждого написанного им учебника) вместо одного. Тем не менее, отношение ПРЕПОДАВАТЕЛЬ находится в NFBC (ключевой атрибут - ИМЯ).

Заметим, что указанные аномалии исчезают при замене отношения ПРЕПОДАВАТЕЛЬ его проекциями:

--------------------------- -------------------------------

| ИМЯ | КУРС | | ИМЯ | УЧЕБНОЕ_ПОСОБИЕ |

--------------------------- -------------------------------

| N | Теория упругости | | N |Теория упругости |

| N | Теория колебаний | | N |Теория колебаний |

| K | Теория удара | | K |Теоретическая механика |

| K | Теория упругости | | K |Теория удара |

--------------------------- -------------------------------

Аномалия обновления возникает в данном случае потому, что в отношении ПРЕПОДАВАТЕЛЬ имеются:

  1. зависимость множества значений атрибута КУРС от множества значений атрибута ИМЯ
  2. зависимость множества значений атрибута УЧЕБНОЕ_ПОСОБИЕ от множества значений атрибута ИМЯ.

Такие зависимости и называются многозначными и обозначаются как

ИМЯ ->> КУРС ИМЯ ->> УЧЕБНОЕ_ПОСОБИЕ

Нетрудно показать, что многозначные зависимости всегда образуют связанные пары, поэтому их часто обозначают

ИМЯ ->> КУРС | УЧЕБНОЕ_ПОСОБИЕ

Очевидно, что каждая функциональная зависимость является многозначной, но не каждая многозначная зависимость является функциональной.

Определение четвертой нормальной формы:

Отношение находится в 4NF если оно находится в BCNF и в нем отстутсвуют многозначные зависимости, не являющиеся функциональными зависимостями.

Структурированный язык запросов SQL. Многотабличные запросы.

Многотабличные запросы

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

Пример 1.Из таблицы ПОСТАВЩИКИ выбрать записи, где ДатаПоставки – 2006 год. Окно конструктора запросов при этом будет иметь вид (рис.10.2).

10.2. Запрос на выборку для решения задачи (пример 1)

Пример 2.Составить запрос на удаление: из таблицы ТОВАРЫ удалить записи, где Стоимость товара меньше 1000. Для этого вызывается таблица ТОВАРЫ, перетаскивается символ * и в строке Удаление выбирается Из(см. первый столбик рис.10.3). Во второй столбец, перетаскивается имя поля, для которого устанавливаются Условия.

 

Рис.10.3. Запрос на удаление записей

Запрос, который создается с помощью бланка QBE, будет храниться в компьютере в виде директивы SQL, называемой сообщением. При работе с Access сам язык SQL от нас обычно скрыт. Например, все операции с запросами выполняются с использованием SQL, но при этом мы видим на экране лишь бланк запроса. Сообщения SQL и окно бланка запроса связаны динамически: любое изменение в одном из них автоматически приводит к изменению в другом. Переход от одного режима к другому осуществляется через пункты меню Вид.

При создании большинства запросов знание языка SQL не требуется. Достаточно для этого бланка QBE. Однако, нередко легче внести изменения в режиме SQL непосредственно, чем открывать и редактировать форму отдельного запроса каждый раз при изменении набора данных. Кроме того, когда нужно создавать подчиненные запросы, результаты которых используются в качестве условий сравнения в других запросах, необходимо знание языка SQL.

Cообщение SQL состоит из ключевых слов, а также идентификаторов и выражений Access. Наиболее важные ключевые слова в SQL:

select - первое слово всех сообщений SQL, с помощью которого проводится поиск данных в одной или нескольких таблицах в базе данных. За ключевым полем select следуют имена всех полей, которые включаются в выборку. Используя знак * после select, можно автоматически включить в запрос все поля исходной таблицы;

 

distinct – исключает повторяющиеся значения из поля в наборе записей, которые найдены с помощью SQL;

distinctrow – удаляет дублирующие записи из выборки;

from – указывает, какая таблица (или таблицы) содержат нужные нам поля;

join - обозначает связь между записями, содержащимися в разных таблицах;

where – обозначает условия выбора, которые должны использоваться при выборе записей для включения их в выборку;

order by – обозначает режим сортировки для набора данных (по умолчанию сортировка осуществляется по возрастанию, для сортировки значений по убыванию необходимо добавить слово desc);

group by – означает, что будет возвращена одна запись для каждого отдельного значения в указанном поле. Если group by включается в select,список выбора должен включать функции avg, count, sum и др.

; -символ, заканчивающий любое SQL сообщение.

При вводе условий выбора записей можно использовать знаки отношений, логические операции and и or, операторы: between, in, like.

Для иллюстрации синтаксиса языка SQL воспользуемся таблицей Продажи”. Пример 1. Записать сообщение SQL, для заполнения поля “Стоимость”, значение которого вычисляется по формуле:Стоимость = Продано * Цена_Ед

Select distinctrowПродажи.Продано,

Продажи.Цена_ед,

[Продано]*[Цена_ед] as Стоимость

fromПродажи;

Пример 2. Найти записи с датой заказа в марте месяце.

select *

from Продажи

where month(Дата_заказа) = 3;

Пример 3. Записи таблицы, полученные в примере 2, расположить по возрастанию кода покупателя.

select *

from Продажи

where month(Дата_заказа) = 3

order by Код_покупателя;

Пример 4. Подсчитать стоимость товаров, сделанных каждым покупателем.

select distinctrow.Код_покупателя,

sum([Продано]*[Цена_ед]) as Стоимость

from Продажи

group by Код_покупателя;

Пример 5. Выбрать записи с датой заказа 31 марта 2006.

select *

from Продажи

where Дата_заказа = #3/31/06#;

Пример 6. Запрос с параметром на выборку по названию кафедры.

select *

from Кафедра

where Название=[Введите название кафедры];