- •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. Резюме
Каждыи экземпляр сущности ности «Произведение"
типа Y обязательно является
экземпляром сущности типа X
Кроме того, следует отметить, что вполне возможно возникновение конфликтов между терминами, которые представлены в табл. 13.1 и используются на семантическом уровне, и терминами, которые используются в рамках выбранного формального подхода, например в реляционной модели. В частности, во многих схемах семантического моделирования вместо термина свойство используется термин атрибут, но при этом совсем не обязательно подразумевается, что такой атрибут представляет (или отображается на)
то же самое, что и атрибут реляционного уровня. Еще одним (важным!) примером может быть то, что концепция типа сущности, как она понимается в семантическом моделировании, отличается от концепции типа, которая рассматривалась в главе 5. Точнее говоря, подобным типам сущностей в реляционном проекте соответствуют переменные-отношения, а потому они, очевидно, не соответствуют реляционными типам атрибута (доменам). Однако по перечисленным ниже причинам они не полностью соответствуют и типам отношений.
На семантическом уровне некоторые базовые типы отношений, вероятно, будут соответствовать типам связей, а не типам сущностей.
Говоря упрощенно, производные типы отношений могут вообще ничему не соответствовать на семантическом уровне.
Путаница при определении этих уровней (в частности, вследствие несогласованности используемой терминологии) как в прошлом, так и в настоящем часто служит причиной дорогостоящих ошибок (см. раздел 25.2 главы 25).
В заключение следует заметить, что в главе 1 связи рассматривались как сущности особого рода, причем подчеркивалось, что подобным же образом они будут рассматриваться во всей книге. Кроме того, в главе 3 как одно из преимуществ реляционной модели отмечалось единство представления всех типов сущностей, включая связи, посредством переменных-отношений. Тем не менее концепция связей (так же, как и концепция сущностей) действительно интуитивно полезна при описании реального мира. Более того, представленный ниже, в разделах 13.3-13.5, подход к проектированию базы данных будет в значительной степени опираться на различия между сущностями и связями. Поэтому в нескольких следующих разделах будет принята терминология, предусматривающая разделение понятий сущностей и связей, однако в разделе 13.6 по этому вопросу будут представлены некоторые дополнительные замечания.
13.3. Модель "сущность/связь"
Как уже упоминалось в разделе 13.1, одним из наиболее известных и получивших широкое распространение методов семантического моделирования является построение модели "сущность/связь" (или ER-модели). Этот подход строится на использовании модели "сущность/связь", предложенной Ченом в 1976 году [13.5] и с тех пор неоднократно усовершенствовавшейся как самим Ченом, так и многими другими исследователями (об этом можно прочесть, например, в [13.13], [13.40]—[ 13.42]). Дальнейшее обсуждение в настоящей главе, в основном, посвящено именно данному подходу. (Следует подчеркнуть, что модель "сущность/связь" является далеко не единственной "расширенной" моделью— их было предложено достаточно много. В частности, в [13.5], [13.13], [13.25] и особенно в [13.19] приведены общие вводные сведения по некоторым из них, а в [13.22], [13.31] — вводные обзоры по данной теме.)
ER-модель включает аналоги всех семантических объектов, представленных в табл. 13.1, каждый из которых подробно рассматривается далее в этой главе. Прежде всего отметим, что в [13.5] была предложена не только сама ER-модель как таковая, но и соответствующая ей технология построения диаграмм, получивших название "ER-диаграммы". Более подробно ER-диаграммы описываются в следующем разделе, а на рис. 13.1 показан простой пример подобной диаграммы, взятый из [13.5]. Это
пример представления структуры данных некоторой производственной компании (KnowWare, Inc.). Он будет полезен при изучении последующего материала этой главы и подробно описывается ниже. (Это расширенная версия ER-диаграммы, приведенной на рис. 1.5 в главе 1.)
Рис. 13.1. Диаграмма модели "сущность/связь" (сокращенная версия для рассматриваемого примера)
Замечание. Большинство рассматриваемых в следующих подразделах идей хорошо известно тем, кто знаком с реляционной моделью. Но, как будет показано, между используемыми в этих двух моделях терминами существуют определенные различия.
Сущности
Работа [13.5] начинается с определения сущности (entity) как "предмета, который может быть четко идентифицирован". При этом сущности подразделяются на сильные и слабые. Слабой называется такая сущность, существование которой зависит от другой сущности, т.е. она не может существовать, если этой другой сущности не существует. Например, на рис. 13.1 сущность DEPENDENT (подчиненный работник) является слабой, поскольку она не может существовать (в контексте данной базы данных), если не существует соответствующей сущности EMPLOYEE (работник). В частности, если сведения о некотором работнике (сущность EMPLOYEE) будут удалены, то и сведения обо всех зависящих от него работниках (сущности DEPENDENT) также будут удалены. Сильной называется сущность, которая не является слабой. В нашем примере сущность EMPLOYEE — сильная.
Замечание. Некоторые авторы вместо термина "сильная сущность" используют термин "нормальная (regular) сущность".
Свойства
Сущности (и связи) обладают некоторыми свойствами (property). Все сущности или связи одного и того же типа обладают некоторыми общими свойствами. Например, все работники имеют личный номер, имя, зарплату и т.д. (Замечание. В данном примере среди свойств работника сознательно не упоминается номер отдела; причина этого разъясняется несколько ниже.) Значения свойств каждого типа извлекаются из соответствующего множества значений, которое в реляционной терминологии называется доменом. Ниже перечислены некоторые разновидности свойств и указаны их особенности.
Простое или составное свойство. Например, свойство "имя работника" может быть составным, если его значение составляется из значений простых свойств "имя", "отчество" и "фамилия".
Ключевое свойство (т.е. уникальное, возможно, в определенном контексте). Например, имя подчиненного работника для определенного сотрудника может быть уникальным только в контексте этого сотрудника.
Однозначное или многозначное свойство (т.е. в этой модели допускаются повторяющиеся группы). Все свойства, представленные на рис. 13.1, являются однозначными. Однако если некоторый поставщик (SUPPLIER) будет иметь несколько разных пунктов отгрузки, то свойство CITY (Город) для него будет многозначным.
Опущенное свойство (т.е. "неизвестное" или "непредставленное"). Эта концепция не отражена на рис. 13.1, а ее более подробное описание приводится в главе 18.
Базовое или производное свойство. Например, общее количество деталей определенного вида может быть вычислено с помощью суммирования объема отдельных поставок данной детали. Эта концепция также не представлена на рис. 13.1.
Связи
В [13.5] связь (relationship) определяется как "ассоциация, объединяющая несколько сущностей". Например, между отделами и работниками существует связь с именем DEPT ЕМР. Она представляет тот факт, что в каждом отделе работает определенное количество работников. Так же, как и в отношении сущностей (см. главу 1), необходимо понимать принципиальную разницу между типами и экземплярами связей, однако при неформальном описании такими тонкостями можно пренебречь, что мы и будем неоднократно делать в будущем.
Сущности, включенные в связь, называются ее участниками, а количество участников связи называется ее степенью. (Следует отметить, что в данном случае значение термина "степень" отличается от его значения в реляционной модели.)
Пусть R является типом связи, включающей тип сущности Е в качестве участника. Если каждый экземпляр сущности Е участвует по крайней мере в одном экземпляре связи R, то участие сущности Е в связи R называется полным, в противном случае — частичным. Например, если каждый работник обязательно должен относиться к определенному отделу, то участие сущности EMPLOYEE в связи между работниками и отделами (DEPT_EMP) является полным. В свою очередь, если допустима ситуация, когда в некотором отделе не будет ни одного работника, участие сущности DEPARTMENT в связи DEPT_EMP будет частичным.
Связи в модели "сущность/связь" могут иметь тип "один к одному", "один ко многим" (иначе может называться "многие к одному") или "многие ко многим". (Для упрощения изложения далее предполагается, что все связи являются двойными, т.е. имеют степень "два", хотя, конечно, изложенные концепции и терминологию можно без труда расширить и на связи с более высокой степенью.) Здесь читатель, уже знакомый с основами реляционной модели, мог бы заметить, что именно тип связи "многие ко многим" является единственным типом, представляющим истинную связь, поскольку это единственный тип связи, который требует для своего представления создания отдельной переменной-отношения. Связи типа "один к одному" и "один ко многим" всегда могут быть представлены с помощью механизма внешнего ключа, помещаемого в одну из переменных-отношений, участвующих в данной связи. Однако существуют веские причины рассмотрения связей типа "один к одному" и "один ко многим" таким же образом, как и связи типа "многие ко многим", по крайней мере из-за того, что достаточно часто существует возможность их эволюционирования до связи типа "многие ко многим" с течением времени. И только если такой возможности нет, их можно рассматривать как-то иначе. Безусловно, в некоторых случаях подобной возможности может не быть в принципе, например всегда будет верным утверждение, что окружность обладает только одной точкой, являющейся ее центром.
Подтипы и супертипы сущностей
Замечание. Представленные в этом разделе идеи не были включены в оригинальную версию ER-модели [13.5]; они были добавлены позднее. Подробнее об этом можно прочесть, например, в работе Тиори (Теогеу), Янга (Yang) и Фрая (Fry) [13.41].
Каждая сущность имеет по крайней мере один тип, однако у некоторой сущности может быть одновременно несколько типов. Например, если некоторые работники являются программистами (и все программисты являются работниками), то можно сказать, что тип сущности PROGRAMMER (программист) является подтипом типа сущности EMPLOYEE (работник). (Или, что эквивалентно, тип сущности EMPLOYEE является супертипом типа сущности PROGRAMMER.) Программисты автоматически обладают всеми свойствами работников, однако обратное утверждение неверно (например, для программистов может быть задано свойство "изученный язык программирования", которое в общем случае не применимо ко всем работникам). Аналогично сущность PROGRAMMER автоматически участвует во всех связях, в которых участвует сущность EMPLOYEE, однако обратное утверждение также неверно (например, программисты могут входить в профсоюз компьютерных специалистов, в который прочие работники в общем случае не входят). Поэтому говорится, что подтип наследует свойства и связи супертипа.
Обратите внимание, что одни программисты (сущность PROGRAMMER) могут быть прикладными программистами (сущность APPLICATION_PROGRAMMER), а другие — системными программистами (SYSTEM_PROGRAMMER). Исходя из этого, можно сказать, что типы APPLICATION_PROGRAMMER и SYSTEM_PROGRAMMER являются подтипами супертипа PROGRAMMER и т.д. Иначе говоря, сущность-подтип по-прежнему является типом сущности и, следовательно, может иметь собственные подтипы. Некоторый тип сущности, его непосредственные подтипы, подтипы этих подтипов и т.д. все вместе образуют иерархию типов сущности, пример которой представлен на рис. 13.2.
Здесь стоит подробно рассмотреть следующие особенности.
Поскольку детальное обсуждение иерархии и наследования типов будет отложено до главы 19, следует предупредить читателя, что в данной главе термин тип имеет такое же значение, как и в главе 5 (т.е. он не означает "тип сущности").
Для читателей, знакомых с СУБД IMS (или какой-нибудь иной СУБД, в которой используется иерархическая структура данных), необходимо отметить, что иерархии типов не следует путать с иерархиями данных. Например, на рис. 13.2 вовсе не подразумевается, что для одного работника (EMPLOYEE) имеется несколько соответствующих программистов (PROGRAMMER). Наоборот, для одного экземпляра типа сущности EMPLOYEE существует не более одного соответствующего экземпляра типа сущности PROGRAMMER, представляющего того же работника в роли программиста.
На этом краткое обсуждение основных структурных особенностей ER-модели завершено, и можно перейти к рассмотрению ER-диаграмм.
Рис. 13.2. Пример иерархии типов сущностей
13.4. ER-диаграммы
Как уже указывалось в предыдущем разделе, в [13.3] была не только введена сама модель "сущность/связь", но и представлена концепция ER-диаграмм. Такая диаграмма является методом представления логической структуры базы данных в графическом виде для более простого и наглядного отображения основных компонентов конкретного проекта базы данных (один рисунок порой стоит тысячи слов). Действительно, популярность методов ER-моделирования как подхода для проектирования баз данных, скорее всего, объясняется именно наличием подобной диаграммной технологии, а не чем-либо иным. Ниже правила создания ER-диаграмм поясняются на примерах, представленных на рис. 13.1 и 13.2.
Замечание. Так же, как и сама модель "сущность/связь", технология создания ER-диаграмм постоянно совершенствуется, поэтому в данном разделе будет описана та ее версия, которая отличается в некоторых важных аспектах от оригинальной методики, предложенной Ченом в [13.3].
Сущности
Каждый тип сущности на ER-диаграмме представляется в виде отдельного прямоугольника с указанным внутри именем сущности, причем прямоугольники сущностей слабых типов рисуются двойной линией.
Примеры (см. рис. 13.1)
■ Сильные сущности:
DEPARTMENT (отдел) EMPLOYEE (работник) SUPPLIER (поставщик) PART (деталь) PROJECT (проект)
■ Слабая сущность: DEPENDENT(подчиненный)
Свойства
Свойства отображаются на ER-диаграмме в виде эллипсов, содержащих имена этих свойств. Эллипсы соединяются с соответствующей сущностью (или связью) сплошной линией. Контур эллипса рисуется штриховой линией, если свойство производное, и двойной линией, если свойство многозначное. Если свойство составное, то составляющие его свойства показаны в виде других эллипсов, соединенных с эллипсом составного свойства с помощью дополнительных линий. Имена ключевых свойств обычно подчеркиваются, а множества значений не отображаются вовсе.
Примеры (см. рис. 13.1)
■ Для сущности EMPLOYEE:
EMPt (личный номер работника — ключевое свойство)
ENAME (полное имя — составное, состоящее из свойств FIRST (имя), Ml (отчество) и LAST (фамилия)) SALARY (зарплата)
■ Для сущности SUPPLIER:
Si (номер поставщика— ключевое свойство)
SNAME (имя поставщика)
STATUS (статус поставщика)
CITY (город, в котором находится поставщик)
Для связи SUPP_PART_PROJ: QTY (количество)
Для связи PART_STRUCTURE: QTY (количество)
Для экономии места другие свойства, представленные на рис. 13.1, не показаны.
Связи
Каждый тип связи показан на ER-диаграмме в виде ромба с названием связи внутри. Ромб рисуется двойной линией, если это связь между слабым типом сущности и типом сущности, от существования которого она зависит. Участники каждой связи соединяются с ромбом соответствующей связи сплошными линиями. Каждая такая линия содержит надпись "1" или "М" для обозначения типа связи ("один к одному", "один ко-многим" и т.д.). Двойная линия обозначает полное участие в связи данной стороны.
Примеры (см. рис. 13.1)
DEPT_EMP (связь типа "один ко многим" между сущностями DEPARTMENT и EMPLOYEE)
EMP_DEP (связь типа "один ко многим" между сущностью EMPLOYEE и сущностью слабого типа DEPENDENT)
PR0J_W0RK и PROJ_MANAGER (обе связи установлены между сущностями EMPLOYEE и PROJECT, причем первая имеет тип "многие ко многим", а вторая — "один ко многим")
SUPP_PART_PROJ (связь типа "многие ко многим" между сущностями SUPPLIER, PARTh PROJECT)
SUPP_PART (связь типа "многие ко многим" между сущностями SUPPLIER и PART)
PART_STRUCTURE (связь типа "многие ко многим" между сущностями PART и PART)
Обратите внимание, что в последнем случае две линии от PART к PART_STRUCTURE отличаются надписями с указанием различных выполняемых ролей (ЕХР и IMP, которые обозначают соответственно "разложение детали на компоненты" и "сборку детали из компонентов"). Связь PART_STRUCTURE является типичным примером рекурсивной связи.
Подтипы и супертипы сущностей
Пусть тип сущности Y является подтипом типа сущности X. Тогда от прямоугольника Y к прямоугольнику X можно провести сплошную линию со стрелкой на конце возле Y. Эта линия представляет то, что иногда называется связью принадлежности фа relationship) (поскольку множество всех сущностей типа Y "является" (is а) подмножеством множества всех сущностей типа X).
Примеры (см. рис. 13.2)
Тип сущности PROGRAMMER является подтипом типа сущности EMPLOYEE
Типы сущностей APPLICATION_PROGRAMMER и SYSTEM_PROGRAMMER являются подтипами типа сущности PROGRAMMER