Программирование >>  Реляционные базы данных 

1 ... 117 118 119 [ 120 ] 121 122 123 ... 125


8-5-4 Ссылки

Эффект идентификации объектов с объектно-ориентированных языках достигается в SQLj за счет понятия ссылки. Компонентом некоторого типа строка таблицы может быть ссылкл на другой тип строка таблицы . Если Т - тип строка таблицы , то REF(7) - тип ссыпки на кортеж типа Т. Если кортеж считается объектом, ссылка на него является его ID.

Пример 8.25- В MovieStar непозможно записать все фильмы, в которых кинозвезды играли, но можно записать их лучшиГг фильм. Сначала нужно описать отношение Movie. При желании можно одновременно описать и т1ш строка таблнцы для этого OTHODjeHiiH. Описание простого типа для фильмов, исключающее связи с кинозвездами, ст>диями или президентами студий, выглядит следующим образом:

CREATE ROW TYPE MovieType( title CHAR(30),

year INTEGER, inColor BIT(1)

Затем можно описать отношение с кортежами этого типа:

CREATE TABLE Movie OF TYPE MovieType;

Теперь необходимо изменить тип MovieStar, включив в него ссылку на лучший фильм каждой кинозвезды (В SQL3 нет ALTER TYPE или других операторов, позволяющих изменить существующее определение типа. Поэтому для изменения ранее определенного типа строка таблицы практически нужно удалить тип строки и все определяемые им таблицы, а затем заново определить тип и восстановить таблицы). Новое определение StarType выглядит так:

CREATE ROW TYPE StarType(

name CHAR(30).

address AddressType,

bestMovIe REF(MovieType) ): □

Пример 8.26. Допустим, между фильмами и кинозвезаами существует стаьиюртная связь многие-ко-многнм : кинозвезда играет во множестве фильмов и в фильме играет множество кинозвезд. В то время как ODL допускает множество кинозвезд в качестве компонента фильмов, в SQL3, наоборот, сохраняется реляционный подход, которому мы следуем в данной книге. Хотя некоторые варианты стандарта SQL3 допускают типы-коллекиии Снапри,\1ер, множества или отношения) в качестве типов атрибутов, скорее всего, эти типы будут отложены до стандарта SQL4. Тем не менее связь [ипа многие-ко-мно1 им можно представить в виде отдельного отношения, содержащего пары связанных элементов

На рис. 8.13 показано, как можно представеть связь играет в между фильмами и кинозвездами. В стчндартач, предшествующих S0L3, связь многие-ко-многмм можно выразить только путем спаривания ключей двух связанных ютассов. SQL3 позволяет ссылаться на объекты (ючнес, на кортежи) прямо через атрибуты, имеющие тип ссылки

Начнем с определения типов MovieType н StarType для отношений Movie и MovieStar соответственно. Для отношения Movie мы возвращаемся к ис.чодному типу StarType. который не содержит лучший фильм. Тип StarslnType, определенный для отношения Starsln. содержит пары ссылок. Каждая такая пара обозначает кинозвезду н фильм, п котором она играет.

За определениями типов строка таблицы следуют описания трех таблиц Movie, MovieStar и Starsln, в которых применяются три этик типа Заметим, что тип AddressType используется не в качестве типа таблицы, а в качестве типа атрибута address в StarType.



CREATE ROW TYPE MovieType( title CHAR(30),

year INTEGER. inColor BIT(1)

CREATE ROW TYPE AddressType( street CHAR(50). city CHAR(20)

CREATE ROW TYPE StarType( name CHAR(30). address AddressType,

CREATE ROW TYPE SiarslnType( star REF(StarType) movie REF(MovieType)

CREATE TABLE Movie OF TYPE MovieType; CREATE TABLE MovieStar OF TYPE StarType; CREATE TABLE Starsin OF TYPE SlarslnType; Рис. 8.13. Кинозвезды, фкпьмы и связь между ними

Сравните представленное здесь отношение Starsin с одноименным отношением схемы БД из раздела 3.9. Последнее содержит атрибуты movieTitle и movieYear вместо ссылок на кортеж, представляющий фильм, и атрибут starName вместо ссылки на кортеж, представляющий кинозвезду □

8.5-5 Следование по ссылкам

Когда компонент одного кортежа может быть ссылкой на кортех< другого (или того же самого) отношения, вполне естественно расширить SQL оператором разыменования. В SQL3 используется оператор ->, имеющий тот же смысл, что и в С. Если .г - ссылка на кортеж г, а о - атрибут этого кортежа, тогда х -> а - это значение атрибута а в кортеже i. Этот оператор полезен во многих запросах SQL3, так как его можно подставлять вместо определенных соединений, необ.ходимых в SQL2.

Пример 8.27. Используя схему на рис. 8.13. найдем названия всех фильмов с участием Mel Gibson. Стратегия поиска -это проверка кажаой пары в Starsin. Если кинозвезда, на которую делается ссылка, - Mel Gibson, п качестве части результата порождается название фильма, на который ссылается второй компонент пары. Запрос SQL3

SELECT movie-> title FROM Starsin

WHERE star -> name = Mel Gibson;

интерпретируется следующим образом. Как и при любом запросе SQL типа select-from-when: расематриваегся каждый кортеж отношения, упомянутого в пункте FROM, например (,v. т). Здесь .v-ссылка на кортеж, представляющий кинозвезду, а /я - на кортеж, представляющий фильм. Пункт WHERE требует определить, совпадает ли компонент пате кортежа MovieStar, на когорый ссылается j, с именем Mel Gibson. Если да, то мы получаем значение компонента title кортежа из отношения Movie, на который ссылается т. и это значение - один из кортежей, порождаемых запросом. □



Разьхменованке и кзвленение компонентов

Одно из р; личиП мелду SQ13 и OQL - трактовка использования-> и точки. в OQL точка и-> являются cииoии.мaiИ. 1<а>1дыГ( из них применим к объекту, яв.чяюшем\ся кортежем и возврашиет компонент этого объекта. В SQL3 как ri и С, эти операторы различны. Оператор-> используется только для ссылки на корте;к. а к са?.тм переменным можно применять только оператор точки (в SQLj обозначается двумя точками). Как и п языке С, еслн г - ссылка на кортеж /, то г->а дает то же значение, что н t..а.

8-5.6 Контексты ссылок

Для ответа на запрос, полобныЛ приведенному в примере 8.27, система БД S0L3 должна интерпретировать выражение следования по ссылке типа star-> name как ссьгтку на поле name отдельного отношения. Один из простых способов действия состоит в том, чтобы просмотреть каждый кортеж в Starsln, последовать его ссылке star н выясьшть, имеет ли кортеж, на который сделана ссылка, ими Mel Gibson. Ho глкой способ потребует много времени, если отношение Starsln велико.

Есть более эффективный пть, если DBMS допускает создание индексов на атрибуте name отношения Я, которые позволяют мо отдельному значению (например, Mel Gibson ) найти кортежн отношения Starsln, ссылающиеся на кортежи отношения Л с компонентом name, совпадающим с Mel Gibson. Но в каком именно от1юшении А вести 1юиск с помощью этих индексов? В данном примере известно, что атрибут star каждого кортекса отношения Starsln имеет значение, являющееся ссылке!! на какой-то кортеж, и что этот кортеж должен находиться в отношении, типом которого являегся StarType. Показано лишь одно такое отношение, MovieStar, поэтому можно ожидать, что ссылка относится именно к нему.

Могут существовать и другие отношения с типом StarType, а значит, необходимо найти пр11на.ыежащие каждому из них индексы дпя имени Mel Gibson . Поиск молет оказаться бесполезным, если по причинам, известным проектировщику, все ссылки сделаны на кортежи одишо и того же отношения, как это н должно быть. Поэтому в SQL3 сеть способ определить, на какое отношение ссылается атрибут. Содержащий ссылку. К описанию отношения, содержащего атрибут, типом которого является ссылка, добаапяется оператор

SCOPE FOR <атрибут> IS <отношение>

Этот оператор означает, что указанный в нем атриб1Т, типом которого должна быть ссылка, всегда ссылается на указанное п нем отношение.

Пример е.2Б. Д;гя получения гарантии, что ссылки star в таблице MovieStar всегда относятся к кортежам отношения MovieStar, а ссылки movie к кортежам отношения Movie, можно дать опнсанне отношения Starsln (рис. S.14). □

CREATE ROW TYPE StarslnType( star REF(StarType),

movie REF(MovieType)

GREAT TABLE Starsln OF TYPE StarslnType SCOPE FOR star IS MovieStar, SCOPE FOR movie IS Movie;

Рис. 8.14. Описоние областей дпр атрибутов ссылки



1 ... 117 118 119 [ 120 ] 121 122 123 ... 125

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика