Многозначные зависимости и четвертая нормальная форма (4NF)
Четвертая нормальная форма касается отношений, в которых имеются повторяющиеся наборы данных. Декомпозиция, основанная на функциональных зависимостях, не приводит к исключению такой избыточности. В этом случае используют декомпозицию, основанную на многозначных зависимостях.
Многозначная зависимость является обобщением функциональной зависимости и рассматривает соответствия между множествами значений атрибутов.
В качестве примера рассмотрим отношение ПРЕПОДАВАТЕЛЬ (ИМЯ, КУРС, УЧЕБНОЕ_ПОСОБИЕ), хранящее сведения о курсах, читаемых преодавателем, и написанных им учебниках. Пусть профессор N читает курсы "Теория упругости" и "Теория колебаний" и имеет соответствующие учебные пособия, а профессор K читает курс "Теория удара" и является автором учебников "Теория удара" и "Теоретическая механика". Тогда наше отношение будет иметь вид:
----------------------------------------------------
| ИМЯ | КУРС | УЧЕБНОЕ_ПОСОБИЕ |
----------------------------------------------------
| N | Теория упругости | Теория упругости |
| N | Теория колебаний | Теория упругости |
| N | Теория упругости | Теория колебаний |
| N | Теория колебаний | Теория колебаний |
| K | Теория удара | Теория удара |
| K | Теория удара | Теоретическая механика |
----------------------------------------------------
добавляем:
----------------------------------------------------
| K | Теория упругости | Теория удара |
| K | Теория упругости | Теоретическая механика |
----------------------------------------------------
Это отношение имеет значительную избыточность и его использование приводит к возникновению аномалии обновления. Например, добавление информации о том, что профессор K будет также читать лекции по курсу "Теория упругости" приводит к необходимости добавить два кортежа (по одному для каждого написанного им учебника) вместо одного. Тем не менее, отношение ПРЕПОДАВАТЕЛЬ находится в NFBC (ключевой атрибут - ИМЯ).
Заметим, что указанные аномалии исчезают при замене отношения ПРЕПОДАВАТЕЛЬ его проекциями:
--------------------------- -------------------------------
| ИМЯ | КУРС | | ИМЯ | УЧЕБНОЕ_ПОСОБИЕ |
--------------------------- -------------------------------
| N | Теория упругости | | N |Теория упругости |
| N | Теория колебаний | | N |Теория колебаний |
| K | Теория удара | | K |Теоретическая механика |
| K | Теория упругости | | K |Теория удара |
--------------------------- -------------------------------
Аномалия обновления возникает в данном случае потому, что в отношении ПРЕПОДАВАТЕЛЬ имеются:
- зависимость множества значений атрибута КУРС от множества значений атрибута ИМЯ
- зависимость множества значений атрибута УЧЕБНОЕ_ПОСОБИЕ от множества значений атрибута ИМЯ.
Такие зависимости и называются многозначными и обозначаются как
ИМЯ ->> КУРС ИМЯ ->> УЧЕБНОЕ_ПОСОБИЕ
Нетрудно показать, что многозначные зависимости всегда образуют связанные пары, поэтому их часто обозначают
ИМЯ ->> КУРС | УЧЕБНОЕ_ПОСОБИЕ
Очевидно, что каждая функциональная зависимость является многозначной, но не каждая многозначная зависимость является функциональной.
Определение четвертой нормальной формы:
Отношение находится в 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 Название=[Введите название кафедры];