- •7.7.6. Определить общее количество поставщиков
- •7.7.7. Определить в поставках максимальное
- •7.7.8. Для каждой поставляемой детали указать номер и общий объем поставки в штуках
- •7.7.9. Указать номера всех типов деталей, поставляемых более чем одним поставщиком
- •7.7.10. Определить имена поставщиков детали с номером т2'
- •7.7.11. Определить имена поставщиков по крайней мере одной красной детали
- •7.7.12. Указать номера поставщиков, статус которых меньше текущего максимального статуса
- •7.7.13. Указать имена поставщиков детали с номером 'р2'
- •7.7.14. Выбрать имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.7.15. Определить имена поставщиков всех типов деталей
- •7.7.16. Определить номера деталей, которые либо весят более 16 фунтов, либо поставляются поставщиком с номером 's2', либо и то, и другое
- •7.8. Резюме
- •8.2. Ограничения типа
- •8.3. Ограничения атрибута
- •8.4. Ограничения переменной-отношения
- •8.5. Ограничения баз данных
- •8.6. "Золотое правило"
- •8.7. Ограничения состояния и ограничения перехода
- •8.8. Ключи
- •3. Пусть r1 и r2 — ссылающаяся и ссылочная переменные-отношения соответственно.
- •8.9. Средства языка sql
- •8.10. Резюме
- •9.1. Введение
- •9.2. Для чего нужны представления
- •9.3. Выборка данных из представлений
- •9.4. Обновление данных в представлениях
- •9.5. Моментальные снимки
- •9.6. Поддержка представлений в языке sql
- •9.7. Резюме
- •Часть III
- •10.1. Введение
- •10.2. Основные определения
- •10.3. Тривиальные и нетривиальные зависимости
- •10.4. Замыкание множества зависимостей
- •10.5. Замыкание множества атрибутов
- •10.6. Неприводимые множества зависимостей
- •10.7. Резюме
- •Глава 1 1
- •I Переменные-отношения в знф I
- •11.2. Декомпозиция без потерь
- •11.3. Первая, вторая и третья нормальные формы
- •11.4. Сохранение зависимостей
- •11.5. Нормальная форма Бойса-Кодда
- •11.6. Замечание по поводу атрибутов, содержащих в качестве значений отношения
- •11.7. Резюме
- •12.1. Введение
- •12.2. Многозначные зависимости и четвертая нормальная форма
- •12.3. Зависимости соединения и пятая нормальная форма
- •Соединение по комбинации атрибутов j#,s#
- •Исходное состояние spj
- •12.4. Общая схема процедуры нормализации
- •12.5. Денормализация
- •12.6. Ортогональное проектирование (небольшое отступление от темы)
- •12.7. Другие нормальные формы
- •12.8. Резюме
- •12.3. Brosda V., Vossen g. Update and Retrieval Through a Universal Schema Interface // acm tods. — December, 1988. — 13, № 4.
- •12.5. Date c.J. Will the Real Fourth Normal Form Please Stand Up? // c. J. Date and Hugh Darwen. Relational Database Writings 1989-1991.— Reading, Mass.: Addison-Wesley, 1992.
- •12.20.Kent w. The Universal Relation Revisited // acm tods. — December, 1983. — 8, № 4.
- •12.22.Maier d., Ullman j.D. Fragments of Relations // Proc. 1983 sigmod Intern. Conf. On Management of Data. — San Jose, Calif. — May, 1983.
- •12.24.Maier d., Ullman j.D. Maximal Objects and the Semantics of Universal Relation Databases // acm tods. — March, 1983. — 8, № 1.
- •Глава 13
- •13.1. Введение
- •13.2. Общий подход
- •Каждыи экземпляр сущности ности «Произведение"
- •13.3. Модель "сущность/связь"
- •13.5. Проектирование базы данных с помощью метода er-моделирования
- •13.6. Краткий анализ er-модели
- •13.7. Резюме
11.7. Резюме
12
Это действительно возможно! Следует
отметить, что это невозможно
в
случае переменной-отношения RVK,
по
крайней мере непосредственно (т.е. без
введения некоторой разновидности
атрибута СШАМЕ,
предназначенного
для указания "имени потенциального
ключа").
упорядочение в том смысле, что каждая переменная-отношение на некотором уровне нормализации автоматически находится на всех более низких уровнях нормализации, тогда как обратное утверждение неверно, т.е. на каждом уровне нормализации могут быть переменные-отношения, которые не находятся на всех более высоких уровнях нормализации. Более того, всегда можно выполнить приведение к НФБК (а на самом деле к 5НФ), т.е. любую заданную переменную-отношение всегда можно заменить эквивалентным набором переменных-отношений, которые находятся в НФБК (или же в 5НФ). Такое приведение используется для того, чтобы избежать избыточности и, следовательно, возникновения некоторых аномалий обновления.
RVK
RVNAME
СК
ATTRNAME
S#
SP
ATTRNAME
S# P#
MARRIAGE
ATTRNAME
HUSBAND DATE
MARRIAGE
ATTRNAME
DATE WIFE
MARRIAGE
ATTRNAME
WIFE HUSBAND
Рис. 11.18. Переменная-отношение RVK, входящая в каталог некоторой базы данных
Процесс приведения (декомпозиции) заключается в замене данной переменной-отношения некоторым набором ее проекций, составленным таким образом, чтобы обратное соединение этих проекций позволяло вновь получить исходную переменную-отношение. Иначе говоря, этот процесс является обратимым (или декомпозиция всегда выполняется без потерь информации). Также было показано, что решающую роль в этом процессе играют функциональные зависимости. Теорема Хита прямо утверждает, что если некоторая декомпозиция выполняется в соответствии с определенной ФЗ, то она будет выполнена без потерь. Такое положение дел может рассматриваться как еще одно подтверждение сделанного в главе 10 заявления о том, что понятие ФЗ является если и "не совсем фундаментальным, то весьма близким к этому".
В данной главе также обсуждалась концепция Риссанена о независимых проекциях и было сделано предположение о том, что в тех случаях, когда существует возможность выбора, исходную переменную-отношение предпочтительнее разбивать именно на независи
мые проекции, а не на проекции, зависимые одна от другой. Декомпозицию на независимые проекции принято называть декомпозицией с сохранением зависимостей. К сожалению, следует отметить, что стремление к достижению двух указанных выше целей, а именно — к декомпозиции без потерь с приведением к НФБК и к декомпозиции с сохранением зависимостей, в некоторых случаях может привести к конфликтной ситуации.
В заключение данной главы вашему вниманию предлагается весьма элегантное (и абсолютно точное) определение ЗНФ и НФБК, данное Заниоло (Zaniolo) [11.7]. Сначала приведем определение ЗНФ.
■ Пусть дана переменная-отношение R, X является некоторым подмножеством атрибутов этой переменной-отношения R и А является некоторым отдельным атрибутом переменной-отношения R. Переменная-отношение R находится в третьей нормальной форме тогда и только тогда, когда для каждой функциональной зависимости X —» А в переменной-отношении R истинно по крайней мере одно из следующих утверждений.
Подмножество X включает атрибут А (т.е. данная ФЗ тривиальна).
Подмножество X является суперключом переменной-отношения R.
Атрибут А входит в состав некоторого потенциального ключа переменной-отношения R.
Определение НФБК можно получить из приведенного выше определения ЗНФ, просто опустив третье утверждение (из чего следует, что НФБК является более строгим ограничением по сравнению с ЗНФ). Именно третье утверждение является причиной той "неадекватности" исходного определения Кодда для ЗНФ [10.4], о которой упоминалось во введении к этой главе.
Упражнения
Докажите теорему Хита. Будет ли верной обратная теорема?
Существует мнение, что каждая бинарная переменная-отношение обязательно находится в НФБК. Верно ли это утверждение?
На рис. 11.19 показана структура информации о персонале компании, которая должна быть помешена в базу данных. Она представлена в том виде, который используется при работе с иерархической СУБД, подобной продукту Information Management System (IMS) фирмы IBM (см. главу 1). Эта структура удовлетворяет следующим правилам.
В компании имеется несколько отделов.
В каждом отделе (Department) есть некоторое количество сотрудников (Employee), занятых в нескольких проектах (Project) и размещающихся в нескольких офисах (Office).
Каждый сотрудник имеет план работы (Job), т.е. несколько заданий, которые он должен выполнить. Для каждого такого задания существует ведомость (Salary history), содержащая перечень денежных сумм, полученных сотрудником за выполнение данного задания.
В каждом офисе установлено несколько телефонов (Phone).
DEPARTMENT
EMPLOYEE
PROJECT
OFFICE
JOB
PHONE
SALARY HISTORY
Рис. 11.19. Иерархическое представление структуры информации о персонале компании, которая должна храниться в базе данных
В базе данных должна храниться следующая информация.
Для каждого отдела: номер отдела (уникальный), его бюджет и личный номер сотрудника, возглавляющего отдел (уникальный).
Для каждого сотрудника: личный номер сотрудника (уникальный), номер текущего проекта, номер офиса, номер телефона, а также название выполняемого задания вместе с датой и размером всех выплат, проведенных в качестве оплаты за выполнение данного задания.
Для каждого проекта: номер проекта (уникальный) и его бюджет.
Для каждого офиса: номер офиса (уникальный), площадь в квадратных футах, номера (уникальные) всех установленных в нем телефонов.
Составьте соответствующее множество переменных-отношений, необходимое для представления этой информации. Обоснуйте любые предположения, которые будут сделаны вами в отношении существующих в них функциональных зависимостей.
11.4. В базе данных системы учета заказов содержится информация о клиентах, деталях и заказах в соответствии с приведенным ниже описанием.
■ Для каждого клиента: номер клиента (уникальный);
адрес доставки (возможно, несколько для одного клиента); балансовый счет (сумма к оплате); максимальный размер кредита; скидка.
■ Для каждого заказа:
информация в заголовке: номер клиента,
адрес доставки, дата выполнения заказа;
детальные строки (несколько на один заказ): номер детали,
заказанное количество.
■ Для каждой детали: номер детали (уникальный); заводы-изготовители; запас деталей на каждом заводе;
минимальное количество деталей на складе для каждого завода; описание детали.
Для внутреннего учета также вводится величина "оставшееся количество", связанная с каждой детальной строкой каждого заказа. Исходно эта величина устанавливается равной заказанной количеству данной детали и последовательно уменьшается до нуля по мере частичного выполнения данной поставки. Составьте проект соответствующей базы данных и, как и в предыдущем упражнении, обоснуйте любые сделанные предположения о существующих функциональных зависимостях.
Предположим, что в упр. 11.4 лишь очень незначительная часть клиентов, например один процент или даже меньше, имеет более одного адреса доставки. (Это обычная ситуация в реальной жизни, когда лишь незначительное число исключений— но достаточно важных— может не вписываться в предлагаемую общую структуру.) Можете ли вы в этом случае указать на какие-либо недостатки решения, которое было предложено вами для упр. 11.4? Какие усовершенствования целесообразно было бы внести для их устранения?
(Модифицированная версия упр. 10.13.) Переменная-отношение TIMETABLE включает следующие атрибуты.
D Р С
т
S L
День недели (1-5) Время в течение дня (1-8)
Номер аудитории Имя преподавателя Имя студента
Название лекции
Кортеж {D:d, Р:р, С:с, T:t, L:l} будет допустимым для этой переменной-отношения тогда и только тогда, когда в момент {D:d, Р:р} некоторый студент s посещает лекцию 1, которая читается преподавателем t в аудитории с. Можно предположить, что каждая лекция продолжается только один академический час и имеет название, уникальное по отношению ко всем другим лекциям, читаемым на данной неделе. Сделайте структуру переменной-отношения TIMETABLE более приемлемой. 11.7. (Модифицированная версия упр. 10.14.) Дана переменная-отношение NADDR с атрибутами NAME (уникальное имя), STREET, CITY, STATE и ZIP. Причем каждому почтовому индексу соответствует только один город и штат, а каждой улице, городу и штату— только один почтовый индекс. Находится ли переменная-отношение NADDR в НФБК, ЗНФ, 2НФ? Можно ли предложить улучшенный вариант этой переменной-отношения?
Список литературы
Помимо приведенного здесь списка литературы, следует также обратить внимание на ссылки к главе 10, особенно [10.4, 10.5] (т.е. ссылки на оригинальные статьи Кодда о ШФ, 2НФиЗНФ).
11.1. Bernstein Р.А. Synthesizing Third Normal Form Relations from Functional Dependencies // ACM TODS. — December, 1976. — 1, Ш 4.
В этой главе обсуждались методы декомпозиции больших переменных-отношений в меньшие. В статье Бернштейна рассматривается обратная задача создания больших переменных-отношений на основе меньших, сформулированная в несколько иной форме. В ней поставлена проблема синтеза переменных-отношений, которые находятся в ЗНФ, на основе заданных множеств атрибутов и соответствующих наборов ФЗ. Однако поскольку атрибуты и функциональные зависимости не имеют смысла вне контекста некоторой переменной-отношения, точнее и строже было бы представить примитивные конструкции как бинарные переменные-отношения, включающее ФЗ, а не просто как пару атрибутов и функциональную зависимость между ними. Замечание. Точно так можно было бы рассмотреть заданное множество атрибутов и ФЗ как универсальную переменную-отношение [12.9], удовлетворяющую заданному множеству зависимостей. В этом случае процесс "синтеза" можно заменить процессом декомпозиции этой универсальной переменной-отношения на проекции в ЗНФ. Однако далее в нашем обсуждении будет использоваться интерпретация на основе синтеза.
В такой ситуации процесс синтеза представляет собой процедуру создания п-арных переменных-отношений на основе бинарных переменных-отношений с заданным множеством ФЗ, связанных с этими переменными-отношениями, с учетом обязательного требования, чтобы все вновь созданные переменные-отношения находились в ЗНФ. (Эта статья была опубликована еще до появления понятия НФБК.) В данной статье также представлены алгоритмы выполнения этой задачи. Одним из возражений относительно такого подхода (принятым Бернштейном), является то, что выполняемые на основании предложенного алгоритма синтеза манипуляции являются чисто синтаксическими и не имеют никакого отношения к семантике. Например, третья из приведенных ниже функциональных зависимостей может быть, а может и не быть избыточной (т.е. может подразумеваться первой и второй из них) в зависимости от смысла переменных-отношений R, S и Т.
А —> В (в R{A,B}) В -» С (в S{B,C}) А -» С (в Т{А,С})
В качестве примера, в котором избыточность отсутствует, допустим, что атрибут А описывает личный номер сотрудника, атрибут В — номер офиса, атрибут С — номер отдела, отношение R содержит сведения об офисах, в которых работают сотрудники, отношение S — об отделах, которым принадлежат офисы, а отношение Т — об отделах, в которых работают сотрудники. Рассмотрим случай, когда некоторый сотрудник работает в офисе не своего отдела. Согласно алгоритму синтеза два атрибута С всегда представляют одно и то же (при этом имена переменных
отношений фактически вообще не рассматриваются). Таким образом, предполагается наличие некоторого внешнего механизма (т.е. вмешательство человека), позволяющего предотвратить семантически неверные манипуляции. В нашем примере следовало бы еще при определении исходных ФЗ использовать для атрибутов из переменных-отношений S и Т различные имена, например С1 и С2.
11.2. Codd E.F. Recent Investigations into Relational Data Base Systems // Proc. IFIP Congress. — Stockholm, Sweden, 1974.
Здесь приводится обзор других работ на данную тему, в частности дается "улучшенное определение третьей нормальной формы", под которой фактически подразумевается нормальная форма Бойса-Кодда. Среди других тем можно найти обсуждение представлений и обновления представлений, подъязыков данных, обмена данными и исследований необходимости (по состоянию на 1974 год).
11.3. Date C.J. A Normalization Problem // The Relational J. — 1992. — 4, N° 2.
В этой статье рассматривается простая задача нормализации, которая используется для представления некоторых идей в области составления проекта базы данных и явного объявления ограничений целостности. Задача сформулирована на основе простой базы данных некоторой авиакомпании с перечисленными ниже ФЗ, где приняты следующие обозначения: FLIGHT — название авиарейса, DESTINATION — место назначения, HOUR — время отправления в часах, DAY — день недели, GATE — выход для посадки на самолет, PILOT — пилот.
{ FLIGHT } -> DESTINATION
{ FLIGHT } -» HOUR
{ DAY, FLIGHT } -» GATE
{ DAY, FLIGHT } ~> PILOT
{ DAY, HOUR, GATE } -» DESTINATION
{ DAY, HOUR, GATE } -» FLIGHT
{ DAY, HOUR, GATE } -> PILOT
{ DAY, HOUR, PILOT } -> DESTINATION
{ DAY, HOUR, PILOT ) -> FLIGHT
{ DAY, HOUR, PILOT ) -» GATE
Помимо всего прочего, этот пример— прекрасная иллюстрация того, что "приемлемый" проект базы данных вряд ли может быть создан только на основе принципов нормализации.
11.4. Heath I.J. Unacceptable File Operations in a Relational Database // Proc. 1971 ACM SIGFIDET Workshop on Data Description, Access, and Control. — San Diego, Calif., November, 1971.
В работе дается определение ЗНФ, которое на самом деле является первым опубликованным определением НФБК. В ней также приводится доказательство теоремы, которая в разделе 11.2 была названа теоремой Хита. Следует отметить, что упомянутые в настоящей главе три этапа процедуры нормализации представляют собой практические воплощения этой теоремы.
11.5. Kent W. A Simple Guide to Five Normal Forms in Relational Database Theory // CACM. — February, 1983. — 26, № 2.
Эта публикация является первоисточником следующей весьма притягательной и несколько перефразированной характеристики ЗНФ (точнее, НФБК): каждый атрибут должен представлять некоторый факт о ключе, о ключе целиком и ни о чем более, кроме ключа.
Rissanen J. Independent Components of Relations // ACM TODS.— December, 1977. —2, №4.
Zaniolo C. A New Normal Form for the Design of Relational Database Schemata // Ibid. — September, 1982. — 7, № 3.
Первоисточник элегантных определений ЗНФ и НФБК, упомянутых в этой главе. Основное назначение статьи — определение новой нормальной формы, нормальной формы с элементарными ключами (НФЭК), которая занимает промежуточное положение между ЗНФ и НФБК и "содержит все преимущества обеих этих форм", но лишена всех их недостатков (например, ЗНФ является "очень нестрогой", а НФБК "склонна к вычислительной сложности"). В статье также показано, что алгоритм Бернштейна [11.1] приводит к генерации переменных-отношений, которые находятся в НФЭК, но не в ЗНФ.
Ответы к упражнениям
11.1. Теорема Хита утверждает, что если переменная-отношение R{A, В, С} удовлетворяет функциональной зависимости А ~» В (где А, В и С являются множествами атрибутов), то R равносильна соединению ее проекций R1 с атрибутами {А, В} и R2 с атрибутами {А, С}. Далее в этом доказательстве будет использован сокращенный неформальный вариант записи вида (а, Ь, с) для представления кортежа {Asa, B:b, С:с}.
Сначала следует показать, что ни один кортеж переменной-отношения R не утрачивается при разбиении на проекции и обратном соединении этих проекций. Пусть (а, Ь, с) е R, тогда (a, b) е R1 и (а, с) е R2, а значит, (а, Ь, с) € Rl JOIN R2. |
Затем следует показать, что каждый кортеж этого соединения действительно является кортежем переменной-отношения R (т.е. при соединении не было получено никаких "побочных" и нежелательных кортежей). Пусть (а, Ь, с) е Rl JOIN R2. Тогда для генерации кортежа соединения должны выполняться зависимости (а, b) € R1 и (а, с) е R2. Следовательно, для генерации кортежа (а, с) е R2 для некоторого атрибута Ь* должен существовать кортеж {а, Ь*, с) е R. Тогда должен также существовать кортеж (a, b*) е R1. Теперь у нас есть (a, b) е R1 и (a, b*) е R1, а поскольку А —> В, значит, b=b*. Отсюда (а, Ь, с) е R. |
Теорема, обратная теореме Хита, утверждает, что если переменная-отношение R{A, В, С} равносильна соединению ее проекций Rl с атрибутами {А, В} и R2 с атрибутами {А, С}, то R удовлетворяет зависимости А -» В. Это утверждение неверно. В качестве примера переменной-отношения, которая равняется соединению двух ее проекций и вовсе не удовлетворяет никакой нетривиальной ФЗ, можно предложить переменную-отношение СТХ, которая показана на рис. 12.2.
11.2. Это утверждение почти (но не совсем) верно. Приведенный ниже экзотический пример обратной ситуации взят из [5.5]. Рассмотрим переменную-отношение USA {COUNTRY,
STATE}, которая интерпретируется как "STATE (штат) является членом COUNTRY (страны)", где под страной в каждом кортеже подразумеваются Соединенные Штаты Америки. Тогда в данной переменной-отношении будет выполняться приведенная ниже ФЗ.
{ } -> COUNTRY
А поскольку пустое множество { } не является потенциальным ключом, переменная-отношение USA не находится в НФБК (она может быть декомпозирована без потерь на две унарные проекции, хотя остается спорным утверждение о том, что она может быть подвергнута дальнейшей нормализации).
Попутно следует заметить, что в общем случае вполне возможно существование потенциального ключа, который является пустым множеством! Подробности можно найти в ответе к упр. 8.7 из главы 8.
11.3. На рис. 11.20 показаны все наиболее важные функциональные зависимости: как те, которые подразумевались в упражнении, так и те, которые соответствуют разум- ным семантическим утверждениям (они перечислены ниже). Атрибутам присвоены имена, поясняющие их значения.
AREA
DBUDGET
OFF#
DEPT#
MGR ЕМРЩ
PHONE*
EMP#
PROJ#
PBUDGET
JOBTITLE
DATE
SALARY
Рис. 11.20. Диаграмма зависимостей для упр. 11.3 Семантические утверждения
Ни один сотрудник не является руководителем одновременно нескольких отделов.
Ни один сотрудник не работает одновременно более чем в одном отделе.
Ни один сотрудник не работает одновременно более чем с одним проектом.
Ни один сотрудник не имеет одновременно более одного офиса.
Ни один сотрудник не имеет одновременно более одного телефона.
Ни один сотрудник не имеет одновременно более одного задания.
Ни один проект не выполняется одновременно более чем одним отделом.
Ни один офис не принадлежит одновременно более чем одному отделу. Этап 0. Определение структуры исходной переменной-отношения
Прежде всего отметим, что исходную иерархическую структуру можно рассматривать как ненормализованную переменную-отношение DEPT0 с атрибутами, содержащими значения типа отношений.
DEPTO { DEPTi, DBUDGET, MGR EMPi, XEMPO, XPROJO, XOFFICEO } KEY { DEPTi } KEY { MGR_EMPi }
Здесь смысл атрибутов DEPTi (номер отдела), DBUDGET (бюджет) и MGR_EMPt (личный номер руководителя отдела) ясен из их названий, а домены, соответствующие атрибутам ХЕМРО (сотрудник), XPROJO (проект) и XOFFICEO (офис), состоят из значений, представляющих собой отношения, и нуждаются в дополнительных разъяснениях.
Значение атрибута XPROJO в составе каждого кортежа переменной-отношения DEPT0 представляет собой отношение с атрибутами PROJi и PBUDGET.
Аналогично значение атрибута XOFFICEO в составе каждого кортежа переменной-отношения DEPT0 представляет собой отношение с атрибутами OFFi, AREA и, скажем, XPHONI0, где атрибут XPHONE0, в свою очередь, имеет значения, представляющие собой отношения. Отношения, являющиеся значениями атрибута XPHONE0, имеют только один атрибут PHONEi.
Наконец, значение атрибута ХЕМРО в составе каждого кортежа переменной-отношения DEPT0 представляет собой отношение с атрибутами EMPi, PROJi, OFFi, PHONEi и, скажем, XJOB0, где атрибут XJOB0, в свою очередь, имеет значения, представляющие собой отношения. Отношения, являющиеся значениями атрибута XJOB0, имеют атрибуты J0BTITLE и, скажем, XSALHIST0, где атрибут XSALHISTO, опять же, имеет значения, представляющие собой отношения. Отношения, являющиеся значениями атрибута XSALHISTO, содержат атрибуты DATE и SALARY.
Таким образом, вся иерархия может быть представлена следующей вложенной структурой.
DEPTO { DEPTi, DBUDGET, MGR EMPi,
XEMPO { EMPi, PROJiT OFFi, PHONEi, XJOBO { JOBTITLE,
XSALHISTO { DATE, SALARY } } }, XPROJO { PROJi, PBUDGET },
XOFFICEO { OFFi, AREA, XPHONEO { PHONEi } } }
Замечание. Вместо описания потенциальных ключей здесь использовано выделение курсивом для обозначения тех атрибутов, которые по крайней мере "уникальны внутри родителя" (на самом деле атрибуты DEPTi, EMPi, PROJi, OFFt и PHONEi являются глобально уникальными согласно утверждениям, сделанным выше).
Этап 1. Исключение атрибутов, содержащих значения-отношения
Для простоты предположим, что каждая переменная-отношение имеет первичный ключ, т.е. всегда на каком-то основании (не важно, на каком) можно выбрать один из потенциальных ключей в качестве первичного. В частности, для переменной-отношения DEPTO в качестве первичного ключа выберем атрибут DEPTi (таким образом, атрибут MGR_EMPi становится альтернативным ключом).
Теперь можно приступить к исключению из переменной-отношения DEPT0 атрибутов, содержащих значения-отношения, поскольку (как отмечалось в разделе 11.6) они являются нежелательными1.
Для каждого атрибута переменной-отношения DEPT0, значениями которого являются отношения (т.е. для атрибутов ХЕМРО, XPROJ0 и XOFFICE0), создадим новую переменную-отношение с атрибутами, состоящими из атрибутов соответствующего отношения плюс атрибут первичного ключа переменной-отношения DEPT0. Первичным ключом каждой из вновь созданных расширенных переменных-отношений будет комбинация того атрибута, который в исходном отношении являлся "уникальным внутри родителя", и первичного ключа переменной-отношения DEPT0. (Обратите внимание, что многие из созданных "первичных ключей" содержат атрибуты, которые являются избыточными для уникальной идентификации кортежей; впоследствии они будут исключены.) Удаляем атрибуты ХЕМРО, XPROJ0 и XOFFICE0 из переменной-отношения DEPT0.
Если какая-либо переменная-отношение R все еще имеет какие-либо атрибуты, значениями которых являются отношения, то описанную последовательность действий для этой переменной-отношения R необходимо повторить.
После выполнения указанных действий будет получен приведенный ниже набор переменных-отношений, из которых исключены все атрибуты, содержащие значения-отношения. Обратите внимание на то, что полученные переменные-отношения, безусловно, находятся в ШФ, но необязательно в какой-то более высокой нормальной форме.
DEFT1 { DiPT#, DBUDGET, MGR EMPl } PRIMARY KEY { DEPTi }~ ALTERNATE KEY { MGR_EMP§ }
EMPl < DEPTI, EMPi, PROJt, OFFi, PHONIi } PRIMARY KEY { DEPTi, EMPi }
J0B1 { DEPTi, EMPi, JOBTITLE }
PRIMARY KEY { DEPTi, EMPi, JOBTITLE }
SALHISTl' { DEPTi, EMPi, JOBTITLE, DATE, SALARY }
PRIMARY KEY { DEPTi, EMPi, JOBTITLE, DATE }
PR0J1 { DEPTi, PROJi, PBUDGET }
PRIMARY KEY { DEPTi, PROJi }
0FFICE1 { DEPTI, OFFI, AREA }
PRIMARY KEY { DEPTi, OFFi }
PHONEI { DEPTi, OFFi, PHONEi }
PRIMARY KEY { DEPTi, OFFi, PHONEi }
Этап 2. Приведение отношений к 2НФ
Теперь переменные-отношения, находящиеся в ШФ, можно привести к эквивалентной совокупности переменных-отношений в 2НФ, исключив те функциональные зависимости, которые не являются неприводимыми. Ниже все такие переменные-отношения рассматриваются последовательно одна за другой.
DEPT1 ЕМР1
J0B1
SALHIST1
PRO Л
0FFICE1
Эта переменная-отношение уже находится в 2НФ. Прежде всего следует отметить, что атрибут DEPTi является избыточным компонентом первичного ключа данной переменной-отношения. В качестве первичного ключа здесь можно принять атрибут EMPi, причем в таком виде данная переменная-отношение уже будет находиться в 2НФ. Опять отметим, что необязательно использовать атрибут DEPTi в качестве компонента первичного ключа. Поскольку атрибут DEPTi функционально зависит от атрибута EMPi, имеется неключевой атрибут (DEPTi), зависимость которого от первичного ключа (комбинации атрибутов {EMPi, JOBTITLE}) не является неприводимой и, следовательно, переменная-отношение J0B1 не находится во 2НФ. Эту переменную-отношение можно заменить двумя другими.
J0B2A { EMPi, JOBTITLE }
PRIMARY KEY { EMPi, JOBTITLE }
JOB2В { EMPi, DEPTi } PRIMARY KEY { EMPi }
Однако переменная-отношение J0B2A является проекцией переменной-отношения SALHIST2 (ниже это описано подробнее), а переменная-отношение J0B2B— проекцией переменной-отношения ЕМР1 (ниже она будет переименована в ЕМР2). Следовательно, обе вновь созданные переменные-отношения могут быть просто удалены.
Так же, как и в случае переменной-отношения J0B1, атрибут DEPTi можно полностью удалить. Более того, как компонент первичного ключа атрибут JOBTITLE не требуется. В качестве первичного ключа достаточно использовать комбинацию атрибутов {EMPi, DATE}. В результате будет получена следующая переменная-отношение, находящаяся в 2НФ.
SALHIST2 { EMPi, DATE, JOBTITLE, SALARY } PRIMARY KEY { EMPi, DATE }
Так же, как и в случае с переменной-отношением ЕМР1, можно рассматривать атрибут DEPTi как неключевой, причем данная переменная-отношение будет находиться в 2НФ. Здесь можно применить аналогичное рассуждение.
PH0NE1 Атрибут DEPTf можно удалить совсем, поскольку переменная-отношение {DEPTI, OFFf) является проекцией переменной-отношения 0FFICE1 (переименованной далее в 0FFICE2), Кроме того, атрибут 0FF# функционально зависит от атрибута PHONEf, поэтому в качестве первичного ключа достаточно принять только атрибут PHONEf, в результате чего будет получена приведенная ниже переменная-отношение в 2НФ.
PHONE2 { PHONEf, 0FF# }
PRIMARY KEY { PHONEf }
Обратите внимание, что эта переменная-отношение необязательно является проекцией переменной-отношения ЕМР 2 (телефоны и офисы могут существовать и без их соотнесения с конкретными сотрудниками), поэтому ее нельзя удалить.
Таким образом, мы получили следующий набор переменных-отношений в 2НФ.
DEPT2 { DEPTf, DBUDGET, MGR EMPf } PRIMARY KEY { DEPTf }~ ALTERNATE KEY { MGR_EMPf }
EMP2 { EMPf, DEPTf, PROJf, OFFf, PHONEf } PRIMARY KEY { EMPf }
SALHIST2 { EMPf, DATE, JOBTITLE, SALARY } PRIMARY KEY { EMPf, DATE }
PR0J2 { PROJf, DEPTf, PBDDGET } PRIMARY KEY { PROJf }
0FFICE2 { OFFf, DEPTf, AREA } PRIMARY KEY { OFFf }
PHONE2 { PHONEf, OFFf }
PRIMARY KEY { PHONEf }
Этап 3. Приведение к ЗНФ
Теперь можно привести переменные-отношения, находящиеся в 2НФ, к эквивалентному набору переменных-отношений в ЗНФ, для чего необходимо исключить транзитивные зависимости. Единственной переменной-отношением, которая находится в 2НФ и не находится в ЗНФ, является переменная-отношение ЕМР2, в которой атрибуты OFFf и DEPTf транзитивно зависят от первичного ключа EMPf: атрибут OFFf через атрибут PHONEf, а атрибут DEPTf — через атрибут PROJf, а также через атрибут OFFf (следовательно, и через атрибут PHONEf). Таким образом, переменной-отношению ЕМР 2 соответствует следующий набор переменных-отношений (проекций) в ЗНФ.
ЕМРЗ { EMPf, PROJf, PHONEf }
PRIMARY KEY { EMPf } X { PHONEf, OFFf }
PRIMARY KEY { PHONEf }
Y { PROJI, DEPTi } PRIMARY KEY { PROJi }
Z { OFFI, DEPTt } PRIMARY KEY { OFFf }
Однако переменная-отношение X — это аналог переменной-отношения PH0NE2, переменная-отношение Y — это проекция переменной-отношения PR0J2, а переменная-отношение Z — это проекция переменной-отношения 0FFICE2. Следовательно, окончательная совокупность переменных-отношений в ЗНФ будет выглядеть следующим образом.
DEPT3 { DEPTt, DBDDGET, MGR_EMPt } PRIMARY KEY { DEPTt } ALTERNATE KEY { MGR_EMP# }
EMP3 { EMPt, PROJt, PHONEi } PRIMARY KEY { EMPt }
SALHIST3 { EMPi, DATE, JOBTITLE, SALARY } PRIMARY KEY { EMPt, DATE }
PR0J3 { PROJt, DEPTt, PBUDGET } PRIMARY KEY { PROJi }
0FFICE3 { OFFi, DEPTt, AREA } PRIMARY KEY { OFFl }
PH0NE3 { PHONEi, OFFi }
PRIMARY KEY { PHONEi }
Наконец, отметим, что каждая из этих переменных-отношений в ЗНФ уже находится в НФБК. |
Следует указать на то, что при учете некоторых (разумных) дополнительных семантических ограничений этот набор переменных-отношений становится сильно избыточным [5.1], так как проекция переменной-отношения PR0J3 по атрибутам {PROJi, DEPTi} практически всегда эквивалентна проекции, выполненной для результата соединения переменных-отношений ЕМРЗ, PH0NE3 и 0FFICE3.
В заключение отметим, что полученный набор переменных-отношений в НФБК можно было "выделить" непосредственно на диаграмме ФЗ. (Вопрос. Как именно это можно сделать?)
Замечание. Это не значит, что "выделить" результирующий набор переменных-отношений в НФБК можно всегда; на самом деле определить результаты декомпозиции подобным образом можно лишь в некоторых конкретных случаях. Точнее говоря, для данной переменной-отношения R, удовлетворяющей множеству функциональных зависимостей S, представленный ниже алгоритм (этапы 0-8) гарантирует декомпозицию D переменной-отношения R на переменные-отношения в ЗНФ (но не НФБК), которая выполняется одновременно без потерь информации и с сохранением зависимостей.
В качестве начального значения для декомпозиции d зададим пустое множество.
Пусть множество I является неприводимым покрытием для множества функциональных зависимостей S.
Пусть X является множеством атрибутов в левой части некоторой зависимости X —> Y, входящей в множество I.
Пусть полное множество ФЗ в I с левой частью, равной множеству атрибутов X, состоит из зависимостей X —> Yl, X —> Y2,...,X —» Yn.
Пусть Z является объединением множеств атрибутов Yl, Y2,Yn.
Заменим декомпозицию d объединением текущего значения d с проекцией переменной-отношения R по атрибутам X и Z.
Повторим пп. 3-5 для каждого атрибута из множества X.
Пусть Al, А2,An являются неучтенными до сих пор атрибутами переменной-отношения R (т.е. такими, которые еще не включены в какую-либо из переменных-отношений в множестве d). Заменим декомпозицию d объединением текущего значения d с проекцией переменной-отношения R по атрибутам Al, А2,An.
Если ни одна из переменных-отношений в декомпозиции d не содержит потенциального ключа R, заменим декомпозицию d объединением текущего значения d с проекцией переменной-отношения R по ее некоторому потенциальному ключу.
В приведенном ниже алгоритме гарантируется получение декомпозиции d переменной-отношения R на переменные-отношения в НФБК, которая выполняется без потерь информации, но необязательно с сохранением зависимостей.
Зададим в качестве начального значения для декомпозиции d переменную-отношение R.
Для каждой переменной-отношения т (которая не находится в НФБК) из состава декомпозиции d выполним действия, перечисленные в пп. 2 и 3.
Пусть X —> Y является функциональной зависимостью в переменной-отношении т, в которой нарушаются некоторые требования НФБК.
Заменим переменную-отношение т в декомпозиции d двумя проекциями, а именно: одной по атрибутам X и Y, а другой — по всем атрибутам, за исключением Y.
Возвращаясь к примеру с персоналом компании, можно предложить читателю еще одно упражнение, которое относится не только к самой процедуре нормализации, но и к проектированию базы данных в целом. Попробуйте расширить описанный выше макет базы данных, включив в него все необходимые определения внешних ключей.
11.4. На рис. 11.21 показаны наиболее важные функциональные зависимости, а соответствующие семантические допущения приведены ниже.
Никакие два клиента не имеют одинаковых адресов доставки.
Каждый заказ имеет уникальный номер.
Каждая детальная строка заказа характеризуется номером строки, уникальным для данного заказа.

QTYORD
QTYOUT
LINE#
DESCN
ITEM#
QTYOH
PLANT*
DANGER
Рис. 11.21. Диаграмма зависимостей для упр. 11.4
Соответствующий набор переменных-отношений в НФБК будет выглядеть приблизительно так.
CUST { CUST*, BAL, CREDLIM, DISCOUNT } PRIMARY KEY { CUST* }
SHIPTO { ADDRESS, CUSTi }
PRIMARY KEY ( ADDRESS )
ORDHEAD { ORDl, ADDRESS, DATE } PRIMARY KEY { ORDl }
ORDLINE { ORDl, LINE*, ITEM#, QTYORD, QTYOUT } PRIMARY KEY { ORDl, LINE! }
ITEM { ITEM!, DESCN }
PRIMARY KEY { ITEM* }
IP { ITEM*, PLANT*, QTYOH, DANGER } PRIMARY KEY { ITEM*, PLANT* }
11.5, Рассмотрим процесс обработки заказов, который должен выполняться программой учета заказов. Предположим, что в поступившем заказе указан номер клиента, адрес доставки и характеристики заказанной детали (номер детали и ее количество).
RETRIEVE CUST WHERE CUST* = input.CUST* ;
<проверка остатка на счету, установленного размера кредита и т.д.> ;
RETRIEVE SHIPTO WHERE ADDRESS = input.ADDRESS ;
AND CUST* = input.CUST*
/* проверка адреса доставки */ ;
IF <все в порядке>, THEN <продолжитъ обработку заказов> ; END IF;
Если 99% клиентов имеют только один адрес доставки, было бы весьма неэффективно помещать адрес в какую-либо другую переменную-отношение, кроме CUST (если рассматривать только эти 99%, то ADDRESS функционально зависит от CUSTt). Исправить ситуацию можно следующим образом. Для каждого клиента укажем один адрес доставки в качестве первичного адреса, который для 99% клиентов будет единственным. Любые другие адреса будут рассматриваться как вторичные. Тогда переменную-отношение COST можно переопределить следующим образом.
CUST { CUSTt, ADDRESS, BAL, CREDLIM, DISCOUNT } KEY { CUSTt }
А переменную-отношение SHIPTO можно заменить такой переменной-отношением.
SECOND { ADDRESS, CUSTt } KEY { ADDRESS }
Здесь переменная-отношение CUST содержит первичные адреса, а переменная-отношение SECOND— вторичные адреса (и соответствующие номера клиентов). Обе переменные-отношения находятся в НФБК. Программа обработки заказов в этом случае будет выглядеть следующим образом.
RETRIEVE CUST WHERE CUSTt = input.CUSTt ;
<проверка остатка на счету, установленного размера кредита и т.д.> ; IF CUST.ADDRESS * input.ADDRESS THEN
RETRIEVE SECOND WHERE ADDRESS = input.ADDRESS ; AND CUSTt = input.CUSTf /* проверка адреса доставки */ ; END IF;
IF <все в порядке>, THEN <продолжитв обработку заказов> ; END IF; Ниже перечислены некоторые преимущества такого подхода.
Для 99% клиентов обработка заказов становится проще и эффективнее.
Если в поступающем заказе опущен адрес доставки, то по умолчанию будет использован первичный адрес.
Предположим, что клиент имеет различные скидки для разных адресов доставки. При первом подходе (показанном в виде ответа к предыдущему упражнению) атрибут DISCOUNT должен быть помещен в переменную-отношение SHIPTO, что приводит к значительному усложнению обработки заказов. Однако при усовершенствованном подходе первичная скидка (соответствующая первичному адресу) может быть представлена посредством введения атрибута DISCOUNT в переменную-отношение CUST, а вторичная скидка— путем введения атрибута DISCOUNT в переменную-отношение SECOND. При этом обе переменные-отношения все еще остаются в НФБК, а обработка заказов упрощается для 99% клиентов.
В заключение следует отметить, что выделение исключительных случаев является, вероятно, хорошим методом использования лучших свойств обоих подходов, т.е. сочетания преимуществ НФБК с упрощением операций выборки данных, которые могут возникнуть при нарушении ограничений НФБК. 11.6. На рис. 11.22 показаны наиболее важные функциональные зависимости; возможный набор переменных-отношений приведен ниже.



SCHED { L, Т, С, D, Р } KEY { L } KEY { Т, D, Р } KEY { С, D, Р }
STUDY { S, L }
KEY { S, L }
11.7. Переменная-отношение NADDR находится в 2НФ, но не в ЗНФ (и, следовательно, не в НФБК). Усовершенствованный вариант может иметь следующий вид.
NSZ { NAME, STREET, ZIP } KEY { NAME }
ZCS { ZIP, CITY, STATE } KEY { ZIP }
Обе переменные-отношения находятся в НФБК, однако следует принять во внимание перечисленные ниже замечания.
Поскольку атрибуты STREET (улица), CITY (город) и STATE (штат) почти всегда используются совместно (например, при создании списка рассылки), а почтовые индексы меняются не очень часто, приведенная выше декомпозиция вряд ли потребуется. (Иначе говоря, нормализацию следует выполнять по отношению к подходящим для этого зависимостям, а не ко всем без исключения.)
В частности, при извлечении полного адреса для заданного в атрибуте NAME имени потребуется выполнить соединение (хотя явное выполнение этого соединения можно заменить определением переменной-отношения NADDR как представления на базе переменных-отношений NSZ и ZCS). Иначе говоря, нор
мализация до уровня НФБК хороша для обновления, но плоха для извлечения данных, поскольку избыточность, которая имеет место при отсутствии полной нормализации, способна вызвать проблемы, связанные с обновлением, но может оказаться весьма полезной при извлечении данных2. Трудности вызываются лишь неконтролируемой избыточностью, тогда как контролируемая избыточность (т.е. избыточность, которая известна и контролируется СУБД) в некоторых ситуациях может быть вполне приемлемой.
■ Функциональная зависимость { STREET, CITY, STATE } -» ZIP явно не представлена в этом макете, а поддерживается отдельно: либо декларативно (если в СУБД поддерживается декларативный язык указания ограничений целостности, аналогичный языку, кратко описанному в главе 8), либо процедурно. На самом деле переменные-отношения NSZ и ZCS не являются независимыми в смысле определения Риссанена [11.6].
Глава
Дальнейшая нормализация: более высокие нормальные формы
