Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Рассмотрим дерево множеств сущностей, соединенных связями isa. Некоторая сущность состоит из компонентов (components), относящихся к одному или нескольким указанным множествам сущностей, если эти компоненты принадлежат поддереву (subtree) исходного дерева, включающему корневую вершину. Другими словами, если некоторая сущность е обладает компонентом с из множества сущностей Е и родительским по отношению к Е в дереве является множество F, то е обладает также некоторым компонентом d из F. Кроме того, с и d должны быть представлены в виде пары во множестве данных для связи isa, направленной от Е к F. Сущность е имеет те же атрибуты, которыми обладает любой из ее компонентов, и участвует в тех же связях, к которым имеет отношение любой из этих компонентов.
Пример 10. Обратимся к рис. 10. Сушность-"кинофильм", которая не относится ни к жанру мультипликации {Cartoons),, ни к числу "боевиков" (Murder-Mysteries), будет обладать только таким компонентом, который принадлежит корневому множеству сущностей Movies ("кинофильмы"). Всем сущностям Movies поставлены в соответствие четыре атрибута (length ("продолжительность"), title ("название"), year ("год производства") и filmType ("тип пленки")) и две связи (Stars-in ("актеры-участники") и Owns ("владеет") — последние на рис. 2.10 не показаны).
Различия параллельных связей
На рис. 10 иллюстрируется одна тонкая особенность ER-связей, требующая дополнительного разъяснения. Диаграмма содержит две различные связи, Studio-of-Star ("студия-владелец актера") и Producing-Studio ("студия-продюсер кинофильма"), и каждая из них соединяет одни и те же множества сущностей — Contracts ("контракты") и Studios ("киностудии"). Мы, однако, не вправе ожидать, что из факта "параллельности" связей следует идентичность множеств данных, соответствующих этим связям. Действительно, в рассматриваемом здесь случае совершенно неправомочно полагать, что обе связи представляют один и тот же "контракт", относящийся к некоторой сущности-"киностудии", поскольку иначе студия должна заключать контракт сама с собой.
В более общем плане можно утверждать, что в ER-диаграмме, содержащей связи, которые соединяют одинаковые множества сущностей, нет ничего противоестественного. В базе данных конкретные экземпляры этих связей при нормальных условиях всегда окажутся различными, подтверждая особый смысл каждой из связей. Если же множества данных для двух или более связей, как предусматривается, должны совпадать, такие связи по существу сводятся к единственной связи, и нет никаких причин отображать их отдельно под разными именами.
Сущность-"мультфильм", не являющаяся "боевиком", обладает двумя компонентами, один из которых относится к множеству Movies, а другой — к Cartoons. Поэтому она получит не только четыре упомянутых выше атрибута множества Movies, но и связь Voices ("голоса"). Аналогичным образом, сущность-"боевик", не являющаяся "мультфильмом", также обладает двумя компонентами, один из которых относится к множеству Movies, а другой — к Murder-Mysteries, и поэтому характеризуется пятью атрибутами, включая weapon ("оружие").
Наконец, сущности-"кинофильмы" (подобные "Roger Rabbit"), которые относятся к жанрам мультипликации и "боевика" одновременно, обладают компонентами всех трех множеств — Movies, Cartoons и Murder-Mysteries. Компоненты соединяются в целостную сущность благодаря связям isa. Рассматриваемые совместно, эти компоненты поставят в соответствие тому же "Roger Rabbit" все четыре атрибута множества сущностей Movies плюс атрибут weapon множества Murder-Mysteries плюс связь Voices множества Cartoons.
Принципы проектирования
1. Достоверность
Прежде всего, проект обязан достоверно представлять спецификацию базы данных. Другими словами, множества сущностей и их атрибуты должны соответствовать реальным требованиям. Вы не вправе, например, ассоциировать с множеством сущностей Stars ("актеры") атрибут number-of-cylinders ("количество цилиндров"), хотя последний вполне применим по отношению к множеству Automobiles ("автомобили"). Прежде чем вводить в модель новое множество сущностей, атрибут или связь, надлежит задаться вопросом, а все ли доподлинно известно о той части реального мира, которая должна быть смоделирована.
Пример 10. Если вновь присмотреться к связи Stars-in ("актеры-участники"), соединяющей множества сущностей Stars ("актеры") и Movies ("кинофильмы"), станет очевидным, что она должна относиться к типу "многие ко многим". Причины бесспорны: здравый смысл, основанный на элементарном понимании моделируемых сущностей, подсказывает, что актеры вправе участвовать в съемках нескольких фильмов, а в каждом фильме могут быть заняты одновременно несколько актеров. Совершенно неправомерно считать, что связь Stars-in в любом направлении может представлять отношение "многие к одному" или, более того, "один к одному".
Пример 11. Подчас, однако, далеко не очевидно, как именно те или иные объекты реального мира должны соотноситься в рамках ER-модели. Рассмотрим для примера множества сущностей Courses ("учебные курсы") и Instructors ("преподаватели"), соединенные связью Teaches ("обучает"). Действительно ли Teaches представляет связь типа "многие к одному" в направлении от Courses к Instructors! Ответ зависит от корпоративной политики и традиций конкретного учебного заведения. Вполне возможно, что за каждым курсом закреплен в точности один преподаватель. Даже в том случае, если несколько преподавателей ведут курс совместно, не исключено, что в соответствии с внутренними требованиями организации в базе данных должен быть указан только один из преподавателей, "ответственный" за курс. В любом из подобных случаев мы имеем право утверждать, что связь Teaches, соединяющая множества сущностей Courses и Instructors^ должна относиться к типу "многие к одному" (если рассматривать ее в указанном направлении).
С другой стороны, в учебном заведении может быть принят такой порядок, когда несколько преподавателей способны заменять друг друга при чтении определенного курса без каких бы то ни было ограничений. Либо изначальный смысл связи Teaches заключается не в том, чтобы отобразить зависимость между курсом и преподавателем, ведущим его в данный момент, а зафиксировать хронологию ведения курса различными преподавателями или просто описать множество преподавателей, готовых к чтению этого курса (наименование связи Teaches само по себе не раскрывает ее истинного смысла). В любом из названных случаев уместно считать, что связь Teaches должна относиться к типу "многие ко многим".
Отсутствие избыточности
Мы обязаны тщательно следить за тем, чтобы объекты структуры не повторяли друг друга. Пусть, например, сущности Movies ("кинофильмы") и Studios ("киностудии") соединены связью Owns ("владеет"). Мы можем также снабдить множество сущностей Movies атрибутом studioName ("название студии"). Хотя такое решение на первый взгляд вполне приемлемо, оно таит в себе ряд опасностей.
1. Повторение описания студии-владельца кинофильма приводит к дополнительному расходу памяти при хранении атрибута в базе данных.
2. При продаже кинофильма мы можем изменить название студии, которая им владела, на новое, определяемое связью Owns, но забыть исправить содержимое атрибута studioName — или умудриться сделать наоборот. Конечно, можно утверждать, что подобные ошибки вряд ли вероятны, но на практике они, к несчастью, случаются, и, пытаясь описать некий объект несколькими различными способами, мы заранее ставим себя, мягко говоря, в невыгодное положение.
Простота
Включайте в проект только те структурные элементы, без которых совершенно нельзя обойтись.
Пример 12. Предположим, что вместо непосредственной связи между множествами сущностей Movies ("кинофильмы") и Studios ("киностудии") мы считаем целесообразным использовать новое "промежуточное" множество сущностей Holdings ("права владения"), описывающее факт принадлежности конкретного фильма определенной студии. Между каждым фильмом и сущностью "права владения" может быть установлена связь Represents ("представляет") типа "один к одному". Общую картину, иллюстрируемую рис. 11, завершает связь типа "многие к одному", соединяющая множества сущностей Holdings и Studios.
Рис. 11. Неудачный пример: в диаграмму включено избыточное множество сущностей
Если говорить формально, структура, приведенная на рис. 11, совершенно верно отображает реальные зависимости, поскольку она позволяет "проследовать" от конкретного кинофильма к студии, которая им владеет, при посредничестве множества сущностей Holdings. Последнее, однако, не выполняет никаких уникальных функций, и его вполне можно исключить. Не сделав этого, при создании базы данных и соответствующих программных приложений мы затратим усилия и время на реализацию более сложных зависимостей и поиск дополнительных вероятных ошибок, а также израсходуем лишнее дисковое пространство. □
Выбор подходящих связей
Множества сущностей могут быть соединены посредством связей разными способами. Однако включение в проект первых попавшихся связей — это не самое хорошее решение. Во-первых, оно способно привести к избыточности схемы, когда одни и те же соотношения множеств сущностей выражаются несколькими цепочками соединений.
Во-вторых, реализация подобной модели потребует дополнительного расхода дискового пространства, а задача внесения изменений в схему базы данных существенно усложнится, поскольку исправление одной связи повлечет необходимость модификации многих других.
Чтобы проиллюстрировать проблемы и описать средства их разрешения, мы воспользуемся двумя примерами: в первом несколько связей представляют одну и ту же информацию, а во втором одна связь может быть получена на основании нескольких других.
Пример 2.15. Вернемся к диаграмме рис. 7, на которой множества сущностей Movies ("кинофильмы"), Stars ("актеры") и Studios ("киностудии") соединены с помощью тернарной связи Contracts ("контракты"). Здесь опущены две бинарные связи, Stars-in ("актеры-участники") и Owns ("владеет"), введенные в диаграмму ранее, на рис. 2. Возникает закономерный вопрос, действительно ли связи Stars-in (между Movies и Stars) и Owns (между Movies и Studios) все еще необходимы при наличии связи Contracts? Ответ таков: "не известно; решение зависит от того, какой смысл мы вкладываем в каждую из трех рассматриваемых связей".
Вполне возможно получить связь, аналогичную Stars-in, на основании связи Contracts. Если актер появляется в фильме только при наличии соответствующего контракта, в котором упоминаются сам актер, студия и производимый ею фильм, тогда действительно необходимость в использовании связи Stars-in отпадает: для определения всех пар вида "актер—кинофильм" для заданных сущностей "актер" и "кинофильм" достаточно просмотреть кортежи "актер—кинофильм—киностудия" множества данных, отвечающего связи Contracts, и выбрать нужные, ограничившись компонентами "актер" и "кинофильм". Если, однако, актер может сниматься в фильме, не подписав контракт — или, что более вероятно с практической точки зрения, не имея контракта, который был бы зафиксирован в нашей базе данных, — тогда во множестве данных связи Stars-in могут существовать такие пары вида "актер—кинофильм", которые не являются частью кортежей "актер—кинофильм—киностудия" множества данных связи Contracts. В этой ситуации связь Stars-in обладает самостоятельным значением и должна быть сохранена.
Подобные соображения применимы и по отношению к связи Owns. Если для каждой сущности "кинофильм" имеется по меньшей мере один "контракт", в который вовлечены как она сама, так и соответствующие сущности "киностудия"-владелец кинофильма и некоторый "актер", связью Owns без какого-либо ущерба можно пренебречь. Если же, напротив, существует вероятность того, что студия владеет кинофильмом и при этом актеры не связаны контрактом на участие в этом фильме либо такой контракт не зарегистрирован в базе данных, связь Owns следует оставить в неприкосновенности.
Если подытожить сказанное, мы не можем дать пригодного на все случаи жизни совета по поводу того, как определить, является конкретная связь избыточной или нет. Вы должны получить нужные сведения от тех, для кого предназначена проектируемая база данных, и на этом основании самостоятельно принять единственно правильное решение. □
Пример 2.16. Давайте вновь обратимся к диаграмме рис. 2. На ней нет каких-либо прямых связей между множествами сущностей Stars ("актеры") и Studios ("киностудии"). Но мы можем получить необходимую соединяющую цепочку, используя свойства связей Stars-in ("актеры-участники") и Owns ("владеет"), поскольку некоторый "актер" связан посредством Stars-in с определенными "кинофильмами", а те, в свою очередь, благодаря связи Owns соединены с соответствующими сущностями-"киностудиями". Таким образом, можно говорить, что актер связан со студией, владеющей фильмом, в котором этот актер снимался.
Имеет ли смысл включать в диаграмму дополнительную связь — что-то вроде Works-for ("работает" на киностудию) — между множествами сущностей Stars и Studios, как показано на рис. 12? И вновь, как и прежде, мы не можем ответить на этот вопрос однозначно, не обладая нужными сведениями. Самое главное, каково истинное назначение этой связи? Если ее смысл таков, что "актер снялся, по меньшей мере, в одном фильме, выпушенном студией", тогда, вероятно, веских причин для использования подобной связи нет, так как аналогичная информация может быть получена на основе существующих связей, Stars-in и Owns.
Однако вполне вероятна ситуация, что имеется некая иная информация (возможно, совершенно уникальная) об особенностях работы актеров со студиями, которая не отражена в цепочке связей Stars-in и Owns. В этом случае связь, соединяющая множества сущностей Stars и Studios напрямую, может оказаться полезной и не восприниматься как избыточная. Например, такая связь должна представить тот факт, что актер связан со студией неким общим контрактом, который не имеет отношения к конкретному кинофильму. Кроме того, как мы упоминали в примере 7, отнюдь не невероятно, что актер, заключивший контракт с одной студией, принимает участие в фильме, выпускаемом другой студией. В подобных ситуациях новая связь Works-for никак не зависит от связей Stars-in и Owns и определенно не будет считаться излишней.
Рис. 12 Включение в диаграмму дополнительной связи.
Использование элементов адекватных типов
Иногда при выборе типа элемента модели, используемого для отображения реального объекта, возможно наличие нескольких альтернатив дальнейших действий. Во многих случаях приходится поразмышлять, чему отдать предпочтение — атрибутам или сочетаниям множеств сущностей и связей. Вообще говоря, атрибут реализовать гораздо проще, нежели множество сущностей или связь. Однако крайности всегда вредны — необоснованное повсеместное применение атрибутов способно привести к неприятностям.
Пример 2.17. Обратимся к рис.2 и рассмотрим одну частную проблему. Насколько здравым было наше решение о представлении объектов "киностудия" отдельным множеством сущностей Studios? Может быть, следовало передать атрибуты "название студии" и "адрес студии" множеству сущностей Movies ("кинофильмы") и исключить Studios вовсе? Если поступить так, как мы сказали, придется повторять адрес студии в наборе данных о каждом кинофильме. Это еще один пример избыточности, подобный тем, которые упоминались в двух предыдущих разделах. Помимо издержек, связанных с избыточностью данных, мы столкнемся со следующей опасностью: если в базе данных будут отсутствовать сведения о каких бы то ни было фильмах, снятых определенной студией, информация об этой студии как таковой окажется утраченной.
С другой стороны, если потребность в хранении адреса студии не возникает, никакого вреда не принесет то, что наименование студии в качестве атрибута будет поставлено в соответствие каждому фильму. Теперь об избыточности из-за многократного повторения адреса студии речь не идет, а то, что наименование студии, такое как, скажем, "Disney", указывается для каждого фильма, снятого этой студией, не может рассматриваться как излишняя информация, поскольку авторские права студии должны быть отражены так или иначе. □
Теперь попробуем абстрагировать выводы, к которым мы пришли, рассматривая пример 2.17, чтобы более строго описать обстоятельства, позволяющие предпочесть атрибут множеству сущностей. Пусть £ — это некоторое множество сущностей. Ниже перечислены условия, которым должно удовлетворять множество Е, чтобы его было целесообразно заменить атрибутом или набором атрибутов нескольких других множеств сущностей.
1. Все связи, в которые вовлечено множество £, обладают стрелками, указывающими на Е. Другими словами, множеству Е должна отводиться роль компонента "один" во всех связях типа "многие к одному" или их обобщениях для случаев многосторонних связей.
2. Атрибуты множества Е в совокупности обязаны однозначно определять любую сущность множества. Чаще всего имеется только один такой атрибут, и в этом случае условие определенно удовлетворяется. Если же множество обладает несколькими атрибутами, ни один из них не должен зависеть от остальных (таким образом, как, например, атрибут address ("адрес") множества сущностей Studios ("киностудии") зависит от атрибута пате ("название") того же множества).
3. Ни в одной из связей множество Е не должно участвовать многократно.
Если все указанные условия удовлетворены, множество сущностей Е может быть заменено другими элементами одним из следующих способов:
a) если существует связь R типа "многие к одному", направленная от некоторого множества сущностей F к множеству Е, следует удалить R и передать атрибуты Е множеству F, выполнив при необходимости их переименование, если F уже содержит атрибуты с теми же именами; в результате каждая сущность множества F получит в качестве атрибута наименование уникальной связанной с ней сущности множества Е 4 (как, например, в случае, когда сущностям "кинофильм" передается атрибут "название студии", а атрибут "адрес студии" исключается).
b) если существует многосторонняя связь R, содержащая стрелку, направленную к £, целесообразно передать атрибуты Е связи R и удалить стрелку, соединяющую R с Е\ примером может служить возврат от диаграммы рис. 8, где было введено новое множество сущностей Salaries, к исходной версии диаграммы с аналогичным атрибутом salary, относящимся к элементу связи Contracts (см. рис. 7).
Пример 2.18. Проанализируем ситуацию, предполагающую выбор компромиссного решения — использовать многостороннюю связь или предпочесть соединяющее множество сущностей и набор из нескольких бинарных связей. В разделе 2.1.8 на мы рассматривали четырехстороннюю связь Contracts ("контракты"), соединяющую сущности "актер" (из множества Stars), "кинофильм" (Movies) и две сущности "киностудия" (Studios) (см. рис.6). На диаграмме рис. 9 в предыдущем разделе эта структура была "механически" преобразована в одноименное соединяющее множество сущностей Contracts с несколькими дополнительными бинарными связями. Возникает вопрос, насколько принципиален подобный выбор.
Если говорить о задаче в том виде, как мы ее представили, можно считать приемлемым любое из двух решений. Если, однако, изменить постановку задачи хотя бы незначительно, мы почти во всех случаях будем вынуждены отдать предпочтение варианту, предполагающему применение соединяющего множества сущностей. Допустим, например, что в контракте упоминаются один актер, некоторый фильм, но любое подмножество студий. (Подобная ситуация более сложна по сравнению с той, которая отображена на диаграмме рис. 6, где контракт охватывает две студии, "играющие" определенные роли.) Теперь мы имеем дело с произвольным числом студий, одна из которых, например, занимается собственно производством фильма, другая осуществляет монтаж спецэффектов, третья несет ответственность за маркетинг и рекламу и т.д., и роли студиям присвоить уже нельзя.
4 В ситуации, где F-сущность не связана ни с какой Е -сущностью, новым атрибутам множества F будут присвоены специальные значения null, свидетельствующие об отсутствии подходящей Е-сущности. Подобное замечание применимо и к случаю передачи атрибутов множества Е связи R, который рассматривается в п. (b).
Чтобы модель адекватно описывала условия поставленной задачи, множество данных связи Contracts должно состоять из кортежей вида
(star, movie, set-of-studios),
и связь Contracts как таковая будет охватывать не только привычные множества сущностей Stars и Movies, но и новое множество сущностей, элементами которого являются множества студий ("set-of-studios"). Хотя в рассматриваемой ситуации такого результата, как кажется, избежать нельзя, похоже, не совсем естественно воспринимать множества студий в виде элементарных сущностей, и поэтому мы не рекомендуем применять указанный подход.
Более предпочтительным представляется решение, в котором контракты описываются множеством сущностей. На диаграмме рис. 9 сущность "контракт" соединяется с сущностями "актер", "кинофильм" и двумя сущностями "киностудия", но сейчас ограничение на количество киностудий, подписывающих контракт, должно быть снято. Связь между множествами Contracts и Studios приобретает свойство "многие ко многим", а не относится к типу "многие к одному", как в том случае, когда Contracts является "подлинным" соединяющим множеством сущностей. Новая версия диаграммы приведена на рис. 13. Еще раз подчеркнем, что теперь контракт соединяет по одной сущности вида "актер" и "кинофильм" с произвольным числом сущностей "киностудия". □
Рис. 13. Контракт соединяет актера и кинофильм с произвольным множеством киностудий
Упражнения к разделу 2.2
Упражнение 2.2.1. На рис. 2.14 представлена диаграмма, описывающая структуру базы данных банка, в которой предусматривается хранение информации о клиентах {Customers) и их счетах {Accounts). Поскольку в общем случае клиент вправе открыть в банке несколько счетов, а счетом могут совместно распоряжаться несколько клиентов, клиентам ставятся в соответствие "наборы счетов" (AcctSets), и каждый счет может быть членом (Member-of) одного или нескольких "наборов счетов". Мы полагаем, что смысл всех остальных связей и атрибутов, приведенных на диаграмме, внятно определяется их названиями (owner-address — "адрес владельца", Has — "обладает", пате — "имя", number — "номер счета", balance — "размер остатка на счете", Lives-at — "проживает", Addresses — "адреса", address — "адрес"). Изучите схему и попытайтесь выдвинуть собственные критические замечания. Какие правила проектирования, по вашему мнению, нарушены? Почему? Какие изменения вы предложили бы внести?
Упражнение 2.2.2. При каких условиях два множества сущностей — Studios ("киностудии") и Presidents ("президенты") — и связь Runs ("возглавляет"), образующие диаграмму рис. 3 (с учетом атрибутов, которые для краткости опущены), могут быть заменены единственным множеством сущностей с соответствующими атрибутами?
Упражнение 2.2.3. Предположим, что атрибут address ("адрес") множества сущностей Studios ("киностудии") на диаграмме рис. 7 удален. Покажите, каким образом множество Studios теперь может быть заменено некоторым атрибутом. Как именно следовало бы расположить этот атрибут?
Рис. 2.14. Неудачный пример: диаграмма банковской базы данных
Упражнение 2.2.4. Выберите атрибуты для перечисленных ниже множеств сущностей диаграммы рис. 2.13, что позволит заменить каждое из этих множеств некоторым атрибутом:
a) Stars ("актеры");
b) Movies ("кинофильмы");
c)! Studios ("киностудии").
Упражнение 2.2.5. В этом и следующих примерах мы рассмотрим два альтернативных проектных решения, касающихся возможности описания события рождения человека. С фактом рождения связана одна сущность "младенец" (событие рождения близнецов может быть отображено набором отдельных кортежей данных), сущность "мать" и произвольные наборы сущностей "медсестра" и "врач". Предположим далее, что имеются множества сущностей Babies ("младенцы"), Mothers ("матери"), Nurses ("медсестры") и Doctors ("врачи"), а также связь Births ("роды"), соединяющая названные множества сущностей так, как показано на диаграмме рис. 2.15. Примите к сведению, что кортеж множества данных связи Births имеет следующий вид:
(baby, mother, nurse, doctor).
Если родовспоможением занимается более одной медсестры и/или врача, будут существовать несколько кортежей для одних и тех же компонентов данных "младенец"
("baby") и "мать" ("mother") — по одному на каждую комбинацию компонентов "медсестра" ("nurse") и "врач" ("doctor").
Существует несколько дополнительных предположений, перечисленных ниже, которые могут быть учтены при построении модели. Рассмотрев каждое из них, ответьте, следует ли для его реализации добавить в диаграмму какие-либо стрелки связей или другие элементы, и если да, то какие именно.
а) Каждой сущности "младенец" соответствует уникальная сущность "мать".
b) Каждому сочетанию сущностей "младенец", "медсестра" и "доктор" соответствует уникальная сущность "мать".
Рис. 16. Представление события "роды" посредством множества сущностей
с) Каждой комбинации сущностей "младенец" и "мать" соответствует уникальная сущность "доктор".
Упражнение 2.2.6. Другой подход к решению проблемы, описанной в упражнении 2.2.5, состоит в соединении множеств сущностей Babies ("младенцы"), Mothers ("матери"), Nurses ("медсестры") и Doctors ("врачи") с множеством сущностей Births ("роды") посредством четырех отдельных связей, как показано на рис. 2.16. Используя стрелки (с целью констатации, что соответствующая связь относится к типу "многие к одному"), обеспечьте реализацию следующих условий:
d) каждая сущность "младенец" связана с уникальной сущностью "роды" и каждая сущность "роды" связана с уникальной сущностью "младенец";
Дата публикования: 2014-11-29; Прочитано: 560 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!