504 fi ZORIENTOWANE OBIEKTOWO JĘZYKI ZAPYTAŃ
jako referencja. Rozpoczynamy od zdefiniowania typów TypFilin oraz TypGwiazda odpowiednio dla relacji Film i Gwia2da.Filutowa. Powróciliśmy tu do początkowej wersji typu wiersza TypGwiazda, w którym nie określa się najlepszego filmu. Typ wiersza o nazwie TypGwiazdyW jest definiowany dla relacji GwiazdyW i zawiera pary referencji, każda para obejmuje odniesienie do gwiazdy oraz do filmu, w którym ta gwiazda występowała.
Po definicjach typów występują deklaracje trzech tabel: Film, Gwiazda Filmowa oraz GwiazdyW, w których korzysta się z uprzednio zdefiniowanych typów wierszy. Zauważmy, że w definicjach tabel nie korzysta się z typu wiersza TypAdres. Jest on używany w określaniu atrybutu adres w definicji typu wiersza TypGwiazda.
Porównamy teraz zdefiniowaną ostatnio relację GwiazdyW z relacją o tej samej nazwie, którą deklarowano w schemacie bazy danych w podrozdziale 3.9. W tej ostatniej relacji zamiast referencji do krotek filmu występowały atrybuty rytu!Filmu i rokFilmu, a zamiast referencji do krotki gwiazdy występował atrybut nazwiskoGwiazdy.
□
Po wprowadzeniu pojęcia referencji i dopuszczeniu, by określała ona typ składowej krotki, rozszerzenie SQL o operator dereferencji jest zupełnie naturalne. W SQL3 operator ten jest oznaczany —► i ma on takie samo znaczenie jak w języku C. A zatem, jeśli a-jest referencją do krotki /, a jest atrybutem /, to x —» a oznacza wartość atry butu a w krotce /. W wielu zapytaniach SQL3 ten operator jest bardzo użyteczny, ponieważ można nim zastępować pewne złączenia, które okazały się tak potrzebne w języku SQL2.
Dziedziny i typ wiersza
W punkcie 5.7.6 poznaliśmy dziedziny, które są rodzajem definicji typów'. Między' dziedzinami a typami wierszy' są dwie istotne różnice. Po pierwsze dziedzina określa typ składowej, a typ wierszowy jest typem krotki.
Ale istnieje subtelniejsza różnica. Jeśli dwie różne dziedziny definiują ten sam typ, to wartości z tych dziedzin są nierozróżnialne. Rozważmy dwa różne typy wierszy- 7j i T2, które zostały jednakowo zdefiniowane. Nie można pomylić krotek pochodzących z relacji określonych tymi typami. Na przykład atrybut, którego typ jest referencją do 71, nie może mieć w artości, która jest referencją do krotki typu T2.
PRZYKŁAD 8.27
Skorzystajmy ze schematu z rys. 8.13 po to, by wyszukać wszystkie tytuły filmów, w których występował Mci Gibson. Sprawdzamy po kolei pary' relacji GwiazdyW. Jeśli referencja gwiazda wskazuje Mela Gibsona, to tytuł wskazywanego filmu dołącza się do wyniku. Stosowne zapytanie w SQL3 ma następującą postać:
SELECT filiu-*tytui
FROM GwiazdyW
WHERE gwiazda—nazwisko = 'Mel Gibson' ;
Zapytanie ma następującą interpretację. Tak samo jak w zapytaniach se-lect-from-where w języku SQL po kolei rozważamy krotki z relacji wymienionej w klauzuli FROM, nazwijmy je (s, m). s oznacza tutaj referencję do krotki gwiazdy, a m do krotki filmu. W klauzuli WHERE sprawdza się, czy składowa nazwisko krotki relacji GwiazdaFilinowa, wskazywanej przez s, jest równa ‘Mel Gibson’. Jeśli tak jest, to wartość składowej tytuł krotki Filmu, wskazywanej przez m, zostaje dołączona do wyniku zapytania.
□
Dcrefercncja i wydobywanie składowych
Jedna z różnic między $QL3 a OQL polega na sposobie traktowania operatorów —► i kropki. Jak pamiętamy z p. 8.2.3 operatory- kropka i —> są wOQL synonimami. Każdy z nich zastosowany do obiektu OQL, który jest krotką, zwraca wr wyniku wartość wskazywanej składowej. Lecz w języku SQL3, podobnie jak w C, działania tych dwóch operatorów' są różne. Operator —> można tu stosować tylko w przypadku referencji do krotki, a w zmiennych krotkowych można stosować tylko operator kropkowy (w SQL3 zapisywany jako dwie kropki). Tak samo jak w języku C, jeśli r jest referencją do krotki /, to r —> a oznacza tę samą w artość co t:. . a.
Aby uzyskać wynik zapytania takiego jak w przykładzie 8.27, system baz danych SQL3 musi umieć interpretować wyrażenia określające referencję, czyli musi na przykład umieć odczytać, że gwiazda-nazwisko oznacza wartość w polu nazwisko w określonej relacji. Jeden z prostszych sposobów-polega na przeglądaniu wszystkich krotek relacji GwiazdyW, następnie wszystkich wskazywanych tam krotek gwiazd i sprawdzanie, czy wskazana krotka ma w nazwisku ‘Mel Gibson'. Jeśli jednak relacja GwiazdyW jest duża, to taki sposób okazuje się bardzo czasochłonny.
Można by zastosować lepszy sposób, jeśli w systemie DBMS można utworzyć indeks dla atrybutu nazwisko w pewnej relacji R, który od wartości ‘Mel Gibson’ poprow-adzi nas do tych krotek relacji GwiazdyW, które wskazują na krotkę w R z wartością nazwisko równą ‘Mel Gibson’. Ale