Билет №11 1. Нормальные формы отношений 2. Устраните аномалии. Врач Больной Анализ Дата Результаты Иванов Стрелкин Кровь 12.12.01 Жив Петров Сидорчук Кровь 12.12.01 Здоров Сидоров Закавычко Рентген 12.12.01 Едва жив Иванов Марченко Федотов Лапшин Рентген 12.12.02 Жив ФГС 12.12.01 Здоров 3.Определить поставщика, поставившего товар на максимальную сумму. ТОВАР (код товара, наименование, цена) ПОСТАВЩИК (код поставщика, наименование, код города, банковский счёт) ПОСТАВКА (код поставщика, код товара, количество, дата) ГОРОД (код города, название) Ответ 1.Процесс проектирования БД с использование метода НФ является итерационным и заключается в последовательном переводе отношения из 1НФ в НФ более высокого порядка по определенным правилам. Каждая следующая НФ ограничивается определенным типом функциональных зависимостей и устранением соответствующих аномалий при выполнении операций над отношениями БД, а также сохранении свойств предшествующих НФ. Для дальнейшего изложения нужно пояснить следующие термины: Атрибут — свойство некоторой сущности. Часто называется полем таблицы. Домен атрибута — множество допустимых значений, которые может принимать атрибут. Кортеж — конечное множество взаимосвязанных допустимых значений атрибутов, которые вместе описывают некоторую сущность (строка таблицы). Отношение — конечное множество кортежей (таблица). Схема отношения — конечное множество атрибутов, определяющих некоторую сущность. Иными словами, это структура таблицы, состоящей из конкретного набора полей. Проекция — отношение, полученное из заданного путём удаления и (или) перестановки некоторых атрибутов. Функциональная зависимость между атрибутами (множествами атрибутов) X и Y означает, что для любого допустимого набора кортежей в данном отношении: если два кортежа совпадают по значению X, то они совпадают по значению Y. Например, если значение атрибута «Название компании» — Canonical Ltd, то значением атрибута «Штабквартира» в таком кортеже всегда будет Millbank Tower, London, United Kingdom. Обозначение: {X} -> {Y}. Нормальная форма — требование, предъявляемое к структуре таблиц в теории реляционных баз данных для устранения из базы избыточных функциональных зависимостей между атрибутами (полями таблиц). Метод нормальных форм (НФ) состоит в сборе информации о объектах решения задачи в рамках одного отношения и последующей декомпозиции этого отношения на несколько взаимосвязанных отношений на основе процедур нормализации отношений. Цель нормализации: исключить избыточное дублирование данных, которое является причиной аномалий, возникших при добавлении, редактировании и удалении кортежей(строк таблицы). Аномалией называется такая ситуация в таблице БД, которая приводит к противоречию в БД либо существенно усложняет обработку БД. Причиной является излишнее дублирование данных в таблице, которое вызывается наличием функциональных зависимостей от не ключевых атрибутов. Аномалии-модификации проявляются в том, что изменение одних данных может повлечь просмотр всей таблицы и соответствующее изменение некоторых записей таблицы. Аномалии-удаления — при удалении какого либо кортежа из таблицы может пропасть информация, которая не связана на прямую с удаляемой записью. Аномалии-добавления возникают, когда информацию в таблицу нельзя поместить, пока она не полная, либо вставка записи требует дополнительного просмотра таблицы. Таблица находится в первой нормальной форме (1НФ) тогда и только тогда, когда в любом допустимом значении этой таблицы каждая ее строка содержит только одно значение для каждого атрибута (столбца). Таблица находится во второй нормальной форме (2НФ), если она удовлетворяет определению 1НФ и все ее атрибуты (столбцы), не входящие в первичный ключ (ПК), связаны полной функциональной зависимостью с первичным ключом. Полная функциональная зависимость означает, что в составе потенциального ключа отсутствует меньшее подмножество атрибутов, от которого можно также вывести данную функциональную зависимость. Например, данная таблица находится в 1НФ, но не во 2НФ, - цена автомобиля зависит от модели и фирмы, скидка же зависит только от фирмы, т.е зависимость от ПК неполная. Модель Фирма Цена Скидка М5 BMW 5500000 5% Х5М BMW 6000000 5% М1 BMW 2500000 5% GT-R Nissan 5000000 10% Исправляется это путем декомпозиции на два отношения, в которых не ключевые атрибуты зависят от ПК. Модель Фирма Цена М5 BMW 5500000 Х5М BMW 6000000 М1 BMW 2500000 GT-R Nissan 5000000 Фирма Скидка BMW 5% Nissan 10% Таблица находится в третьей нормальной форме (ЗНФ), если она удовлетворяет определению 2НФ и ни один из ее неключевых атрибутов не связан функциональной зависимостью с любым другим неключевым атрибутом. Рассмотрим пример таблицы: Модель Магазин Телефон BMW Планета-авто 2-12-33 Opel Планета-авто 2-12-41 Nissan Автомиг 2-12-65 Таблица находится во 2НФ, но не в 3НФ. В отношении атрибут «Модель» является первичным ключом. Личных телефонов у автомобилей нет, и телефон зависит исключительно от магазина. Таким образом, в отношении существуют следующие функциональные зависимости: Модель → Магазин, Магазин → Телефон, Модель → Телефон. Зависимость Модель → Телефон является транзитивной, следовательно, отношение не находится в 3НФ. В результате разделения исходного отношения получаются два отношения, находящиеся в 3НФ: Модель Магазин Магазин Телефон BMW Планета-авто Планета-авто 2-12-33 Opel Планета-авто Планета-авто 2-12-41 Nissan Автомиг Автомиг 2-12-65 Таблица находится в нормальной форме Бойса-Кодда (НФБК) тогда и только тогда, когда любая функциональная зависимость между ее атрибутами сводится к полной функциональной зависимости от возможного первичного ключа. Определение 3НФ не совсем подходит для следующих отношений: 1) отношение имеет две или более потенциальных ключа; 2) два и более потенциальных ключа являются составными; 3) они пересекаются, т.е. имеют хотя бы один атрибут. Для отношений, имеющих один потенциальный ключ (первичный), НФБК является 3НФ. Отношение находится в НФБК, когда каждая нетривиальная и неприводимая слева функциональная зависимость обладает потенциальным ключом в качестве детерминанта. Предположим, рассматривается отношение, представляющее данные о бронировании стоянки на день: № стоянки Время начала Время окончания Тариф 1 09:30 22:30 Суперэконом 1 11:00 21:00 Суперэконом 1 14:00 15:30 Стандарт 2 10:00 20:30 Премиум- 2 12:00 21:30 Премиум- 2 15:00 20:00 Премиум+ Тариф имеет уникальное название и зависит от выбранной стоянки и наличии льгот, в частности: «Суперэконом»: стоянка 1 для льготников «Стандарт»: стоянка 1 для не льготников «Премиум-»: стоянка 2 для льготников «Премиум-»: стоянка 2 для не льготников. Таким образом, возможны следующие составные первичные ключи: {Номер стоянки, Время начала}, {Номер стоянки, Время окончания}, {Тариф, Время начала}, {Тариф, Время окончания}. Отношение находится в 3НФ. Требования второй нормальной формы выполняются, так как все атрибуты входят в какой-то из потенциальных ключей, а неключевых атрибутов в отношении нет. Также нет и транзитивных зависимостей, что соответствует требованиям третьей нормальной формы. Тем не менее, существует функциональная зависимость Тариф → Номер стоянки, в которой левая часть (детерминант) не является потенциальным ключом отношения, то есть отношение не находится в нормальной форме Бойса — Кодда. Недостатком данной структуры является то, что, например, по ошибке можно приписать тариф «Бережливый» к бронированию второй стоянки, хотя он может относиться только к первой стоянке. Можно улучшить структуру с помощью декомпозиции отношения на два и добавления атрибута Имеет льготы, получив отношения, удовлетворяющие НФБК (подчёркнуты атрибуты, входящие в первичный ключ.): Тарифы Тариф Номер стоянки Имеет льготы Суперэконом 1 Да Стандарт 1 Нет Премиум- 2 Да Премиум+ 2 Нет Бронирование Тариф Время начала Время окончания Суперэконом 09:30 22:30 Суперэконом 11:00 21:00 Стандарт 14:00 15:30 Премиум- 10:00 20:30 Премиум- 12:00 21:30 Премиум+ 15:00 20:00 В следующих нормальных формах (4НФ и 5НФ) учитываются не только функциональные, но и многозначные зависимости между атрибутами. Для того чтобы привести определения этих нормальных форм, введем понятие полной декомпозиции таблицы. Полной декомпозицией таблицы называют такую совокупность произвольного числа ее проекций, соединение которых полностью совпадает с содержимым таблицы. Таблица находится в пятой нормальной форме (ЗНФ) тогда и только тогда, когда в каждой ее полной декомпозиции все проекции содержат возможный ключ. Таблица, не имеющая ни одной полной декомпозиции, также находится в 5НФ. Четвертая нормальная форма (4НФ) является частным случаем 5НФ, когда полная декомпозиция должна быть соединением ровно двух проекций. На практике непросто подобрать реальную таблицу, которая находилась бы в 4НФ, но не была бы в 5НФ. 2. Для данной таблицы характерна избыточность данных по дате (множественное повторение), что влечет за собой аномалии обновления и удаления. Врач Больной Анализ Дата Результаты Иванов Стрелкин Кровь 12.12.01 Жив Петров Сидорчук Кровь 12.12.01 Здоров Сидоров Закавычко Рентген 12.12.01 Едва жив Иванов Марченко Федотов Лапшин Рентген 12.12.02 Жив ФГС 12.12.01 Здоров Создадим несколько таблиц: 12.12.01 Врач Больной Анализ Результаты Иванов Стрелкин Кровь Жив Петров Сидорчук Кровь Здоров Сидоров Закавычко Рентген Едва жив Федотов Лапшин ФГС Здоров Анализ Результаты 12.12.02 Врач Больной Иванов Марченко Рентген Жив Таким образом, была также устранена зависимость «один ко многим» (врач – больные: Иванов – Стрелкин, Марченко). Можно добиться более низкой логической избыточности и противоречивости, разделив данные и связи в отдельные таблицы сведений о врачах, больных, анализах и результатах: № Врач № Больной 1 Иванов 1 Стрелкин 2 Петров 2 Сидорчук 3 Сидоров 3 Закавычко 4 Иванов 4 Марченко 5 Федотов 5 Лапшин № Анализ 1 Кровь 2 ФГС 3 Рентген 3. Для решения данной задачи можно использовать Microsoft Access. Для этого нужно использовать таблицы ПОСТАВЩИК, ПОСТАВКА, ТОВАР. Чтобы не терять время я не стал делать все поля в таблице ПОСТАВЩИК, т.к. они для решения задачи избыточны. Создадим Запрос1, а в нем вычисляемое поле: Выражение1:Поставка!Количество*Товар!Цена Рис 1 SELECT Поставщик.Наименование, Поставка!Количество*Товар!Цена AS Выражение1, Товар.Наименование FROM Товар INNER JOIN (Поставщик INNER JOIN Поставка ON Поставщик.[Код поставщика] = Поставка.[Код поставщика]) ON Товар.[Код товара] = Поставка.[Код товара]; Далее создадим перекрестный запрос к этому запросу с подсчетом итоговых значений указанного выше выражения: Рис 2 TRANSFORM Sum(Запрос1.Выражение1) AS [Sum-Выражение1] SELECT Запрос1.Поставщик.Наименование AS Выражение2, Sum(Запрос1.Выражение1) AS [Итоговое значение Выражение1] FROM Запрос1 GROUP BY Запрос1.Поставщик.Наименование PIVOT Запрос1.Товар.Наименование; Нажимаем «Запуск» и получаем список поставщиков с итоговыми отгрузками: Рис 3 Если количество поставщиков превышает возможности человека найти максимальное итоговое значение, то можно создать еще один запрос, - исходными данными будут значения из указанного перекрестного запроса: Рис 4 SELECT DISTINCTROW Запрос1_перекрестный.Выражение2, Запрос1_перекрестный.[Итоговое значение Выражение1] FROM Запрос1_перекрестныйORDER BY Запрос1_перекрестный.[Итоговое значение Выражение1] DESC; Таким образом, верхний в полученном списке поставщик и будет отгрузившим на максимальную сумму. Задача выполнена.