- •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. Резюме
13.5. Проектирование базы данных с помощью метода er-моделирования
В определенном смысле построенная в соответствии с описанными выше правилами ER-диаграмма является проектом базы данных. Если попытаться отобразить подобный проект на некоторую формальную схему, соответствующую требованиям конкретной
СУБД8, то станет ясно, что обычная ER-диаграмма для этого недостаточно точна и в ней отсутствует описание множества важных деталей (особенно тех, которые относятся к целостности данных). Для иллюстрации этого утверждения рассмотрим, что происходит при попытке отобразить проект базы данных, показанный на рис. 13.2, на набор определений элементов реляционной базы данных.
Сильные сущности
На рис. 13.1 показаны следующие сильные типы сущностей.
DEPARTMENT
EMPLOYEE
SUPPLIER
PART
PROJECT
Каждый сильный тип сущности отображается в базовую переменную-отношение. Следовательно, рассматриваемая база данных будет содержать пять базовых переменных-отношений, например DEPT. EMP, S, Р и J, соответствующих этим пяти типам сущности. Более того, каждое из базовых отношений будет иметь потенциальный ключ (DEPTi, EMPi, Si, Pi и Ji), соответствующий указанным на ER-диаграмме ключевым свойствам. Для определенности допустим, что в каждой из создаваемых переменных-отношений соответствующий потенциальный ключ определяется, как первичный. В качестве примера ниже приводится определение переменной-отношения DEPT (в сокращенном виде).
VAR DEPT BASE RELATION { DEPTi ... ) PRIMARY KEY ( DEPT* ) ;
Записать определения остальных четырех переменных-отношений предлагается читателю в качестве упражнения.
Замечание. Безусловно, в документации также должны быть зафиксированы определения доменов и допустимых множеств значений. Однако подробности здесь опускаются, поскольку, как уже отмечалось, множества значений на ER-диаграммах не отображаются.
Связи типа "многие ко многим"
В рассматриваемом примере присутствуют следующие связи типа "многие ко многим".
PR0J_W0RK (между работниками и проектами) SUPP PART (между поставщиками и деталями) SUPP_PART_PROJ (между поставщиками, деталями и проектами) PART_STRUCTURE (между деталями-узлами и деталями, входящими в их состав)
Каждая такая связь отображается и в базовую переменную-отношение. Таким образом, вводятся еще четыре базовые переменные-отношения, соответствующие четырем указанным связям. Допустим, что для связи SUPPJPART такой базовой переменной-отношением является SP (уже знакомая нам переменная-отношение поставок). Временно отложим описание ее первичного ключа и обратимся к внешним ключам этой переменной-отношения, которые необходимы для идентификации участников данной связи.
VAR SP BASE RELATION
{ S# ... , Pt ... , ... }
FOREIGN KEY { Sf } REFERENCES S FOREIGN KEY { Pt } REFERENCES P ;
Ясно, что такая переменная-отношение должна включать два внешних ключа (Sf и Pt), соответствующих двум участникам связи (сущности SUPPLIER и PART), и эти внешние ключи должны ссылаться на соответствующие переменные-отношения S и Р. Более того, для каждого из внешних ключей должен быть задан подходящий случаю набор правил внешних ключей, т.е. правило обновления UPDATE и правило удаления DELETE (за более подробными сведениями по этой теме обратитесь к главе 8). Ниже приведены правила, которые следует задать в случае базовой переменной-отношения SP. (Конечно, эти правила приведены лишь в качестве иллюстрации. В частности, обратите внимание на то, что их нельзя вывести или установить с помощью одной только ER-диаграммы.)
VAR SP BASE RELATION
{ Sf ... , Pt ... , ... }
FOREIGN KEY ( St ) REFERENCES S ON DELETE RESTRICT ON UPDATE CASCADE
FOREIGN KEY ( Pt ) REFERENCES P ON DELETE RESTRICT ON UPDATE CASCADE ;
Что можно сказать о первичном ключе этой переменной-отношения? Одним из возможных способов его определения может быть комбинация внешних ключей, идентифицирующих участников соответствующей связи (в случае базовой переменной-отношения SP ими являются атрибуты Sf и Pt). Это возможно, если данная комбинация имеет уникальное значение для каждого экземпляра данной переменной-отношения (обычно так и бывает, хотя могут быть и обратные случаи) и если разработчик базы данных не возражает против использования составных первичных ключей (на практике это в равной степени возможно и невозможно). В качестве альтернативного варианта первичного ключа можно использовать новый несоставной суррогатный атрибут "номер поставки" (подробности приводятся в [13.10], [13.16]). В нашем примере будет использован первый из двух описанных выше вариантов. Таким образом, в определение SP необходимо добавить следующее предложение.
PRIMARY KEY { St, PI }
В качестве упражнения читателю предлагается самостоятельно рассмотреть связи PR0J_W0RK, PART_STRUCTURE и SUPP_PART_PROJ.
Связи типа "многие к одному"
В рассматриваемом примере присутствуют три связи типа "многие к одному".
PROJ_MANAGER (между проектами и их менеджерами)
DEPT_EMP (между работниками и отделами)
EMP_DEP (между подчиненными и руководящими работниками)
Только в последней из трех связей участвует слабый тип сущности (DEPENDENT), тогда как в двух других участвуют только сильные типы сущностей. Связь со слабым типом сущности будет обсуждаться несколько позже, а сейчас рассмотрим какую-либо из двух других связей, например DEPT_EMP. В данном случае не требуется вводить никаких новых переменных-отношений9. Вместо этого достаточно просто ввести приведенный ниже внешний ключ в переменную-отношение, расположенную со стороны "многие" (ЕМР), который будет ссылаться на переменную-отношение на стороне "один" (DEPT).
VAR EMP BASE RELATION
{ EMPt ... , DEPTt ... , ... }
PRIMARY KEY { EMPt }
FOREIGN KEY { DEPTi } REFERENCES DEPT
ON DELETE ...
ON UPDATE ... ;
В данном случае возможности определения правил удаления DELETE и обновления UPDATE точно такие же, как и в случае внешнего ключа, представляющего участника связи типа "многие ко многим" (в общем случае). Здесь вновь следует отметить, что они не показаны на данной ER-диаграмме.
Замечание. В рассматриваемом примере предполагается, что связи типа "один к одному" (которые не так уж часто встречаются на практике) следует рассматривать так же, как связи "многие к одному". Подробное описание особенностей отображения связей типа "один к одному" приводится в [13.7].
Слабые сущности
Связь между сущностью слабого типа и той сильной сущностью, от которой она зависит, безусловно, является связью типа "многие к одному", как это уже отмечалось выше. Однако правила удаления и обновления для этой связи должны выглядеть так, как показано ниже.
ON DELETE CASCADE ON UPDATE CASCADE
Взятые в совокупности, эти правила выражают обязательную зависимость существования, что иллюстрируется следующим примером.
VAR DEPENDENT BASE RELATION { EMPI ... }
FOREIGN KEY ( EMPi ) REFERENCES EMP ON DELETE CASCADE ON UPDATE CASCADE ;
Что является первичным ключом данной переменной-отношения? Как и в случае со связью "многие ко многим", здесь также возможен некоторый выбор. Одним из вариантов является комбинация внешнего ключа и ключевого свойства слабой сущности, представленного на ER-диаграмме, если, опять же, разработчик базы данных не возражает против использования составных первичных ключей. Альтернативным вариантом первичного ключа является введение нового несоставного суррогатного атрибута (подробности приводятся в [13.10], [13.16]). В рассматриваемом примере мы применим первый из двух приведенных выше вариантов, для чего добавим в определение переменной-отношения следующее предложение.
PRIMARY KEY { EMPf, DEP_NAME }
Свойства
Каждое показанное на ER-диаграмме свойство отображается в отдельный атрибут в соответствующей переменной-отношении, за исключением случая многозначного свойства, для которого потребуется создать новую переменную-отношение, что прямо следует из принципов нормализации. Домены для множеств значений создаются простым и очевидным способом (хотя, конечно, сам выбор множеств допустимых значений может оказаться не совсем простой задачей), поэтому подробности здесь опущены.
Супертипы и подтипы сущности
Поскольку на рис. 13.1 не содержится никаких супертипов или подтипов, далее речь пойдет о примере, представленном на рис. 13.2. Рассмотрим типы сущностей EMPLOYEE и PROGRAMMER. Предположим для простоты, что программисты обладают навыками работы только с одним языком программирования (т.е. свойство LANG является однозначным)10.
■ Супертип EMPLOYEE отображается в базовую переменную-отношение, например ЕМР, обычным образом (т.е. так, как уже обсуждалось выше).
■ Подтип PROGRAMMER отображается в другую базовую переменную-отношение, например PGMR, с таким же первичным ключом, что и у переменной-отношения ее супертипа, но с другим набором атрибутов, соответствующим свойствам, которые применяются для описания только работников-программистов (например, LANG в нашем примере).
VAR PGMR BASE RELATION { EMPt ... , LANG, ... } PRIMARY KEY { EMPt } ... j
Более того, первичный ключ переменной-отношения PGMR также является внешним ключом, который ссылается на переменную-отношение ЕМР. Следовательно, приведенное выше определение необходимо соответствующим образом расширить (в частности, обратите внимание на определение правил удаления и обновления).
VAR PGMR BASE RELATION { EMPt ... , LANG, ... } PRIMARY KEY ( EMPt ) ; FOREIGN KEY ( EMPt ) REFERENCES EMP
ON DELETE CASCADE
ON UPDATE CASCADE ;
■ Нам также потребуется представление, например с именем EMP PGMR, являющееся соединением переменных-отношений супертипа и подтипа.
VAR EMP_PGMR VIEW EMP JOIN PGMR ;
Обратите внимание, что это соединение имеет тип связи "(нуль или один) к одному", направлено от потенциального ключа к соответствующему внешнему ключу и этот внешний ключ сам по себе является потенциальным ключом. В результате представление будет содержать сведения только о работниках-программистах.
Такая структура позволяет выполнять следующие действия.
С помощью базовой переменной-отношения ЕМР можно получить доступ (например, для извлечения данных) к тем свойствам, которые являются общими для всех работников.
С помощью базовой переменной-отношения PGMR можно получить доступ к особым свойствам, принадлежащим только программистам.
С помощью представления EMP_PGMR можно получить доступ ко всему набору свойств программистов.
В базовую переменную-отношение ЕМР можно вставлять сведения о работниках, которые не являются программистами.
Сведения о работниках-программистах можно вставлять в базу данных с помощью представления EMP_PGMR.
Сведения о любых работниках (программистах и не программистах) можно удалить из базы данных, удалив их из базовой переменной-отношения ЕМР, а сведения о работниках-программистах можно удалить из базы данных, удалив их из представления EMP_PGMR.
Свойства, общие для всех работников, можно обновлять в базовой переменной-отношении ЕМР, а свойства только работников-программистов можно обновлять и с помощью представления EMP_PGMR.
Свойства, характерные только для программистов, можно обновлять в базовой переменной-отношении PGMR.
Статус сотрудника-не программиста можно изменить на статус программиста за счет вставки сведений об этом сотруднике в базовую переменную-отношение PGMR или же в представление EMP_PGMR.
Статус программиста можно изменить на статус сотрудника-не программиста за счет удаления сведений об этом программисте из базовой переменной-отношения PGMR.
Читателю предлагается самостоятельно разобраться в других типах сущностей, показанных на рис. 13.2 (APPLICATION_PROGRAMMER и SYSTEM_PROGRAMMER).