Bazy danych i inżynieria oprogramowania

16
K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 1 Bazy danych i inżynieria oprogramowania Kazimierz Subieta Instytut Podstaw Informatyki PAN, Warszawa Polsko-Japońska Wyższa Szkoła Technik Komputerowych, Warszawa Wykład 11: Wprowadzenie do standardu ODMG, część 5: OQL

description

Bazy danych i inżynieria oprogramowania. Wykład 11: Wprowadzenie do standardu ODMG, część 5: OQL. Kazimierz Subieta Instytut Podstaw Informatyki PAN, Warszawa Polsko-Japońska Wyższa Szkoła Technik Komputerowych, Warszawa. Plan wykładu (część 5). Nazwane zapytania - PowerPoint PPT Presentation

Transcript of Bazy danych i inżynieria oprogramowania

Page 1: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 1

Bazy danych i inżynieria oprogramowania

Kazimierz Subieta

Instytut Podstaw Informatyki PAN, Warszawa

Polsko-Japońska Wyższa SzkołaTechnik Komputerowych, Warszawa

Wykład 11:

Wprowadzenie do standardu ODMG, część 5: OQL

Page 2: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 2

Plan wykładu (część 5)

Nazwane zapytania

Binarne zapytania i operatory

Kwantyfikatory Operatory zagregowane

Zdanie Select From Where

Grupowanie

Uporządkowanie, operatory na tablicach i listach

Operacje na zbiorach

Reguły zakresu

Podsumowanie OQL

Page 3: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 3

Swobodne kombinowanie operatorówPodaj nazwę ulicy, gdzie mieszkają pracownicy posiadający najmniejszą średnią płacę w stosunku do innych ulic.

define Pracownicy() asselect (Pracownik) q from Osoby as qwhere “pracuje” in q.co_robi

Zdefiniowanie ekstensji Pracownicy

define UlicaŚrZarobek() asselect ulica, średni_zar: avg( x.p.zarobek from partition as x)from Pracownicy() as pgroup by ulica: p.adres.ulica

Zdefiniowanie wielozbioru par (ulica, średni_zar)Trochę niejasne group_by, KS.

define UlicaŚrZarobekPosortowany() asselect z from UlicaŚrZarobek() as z order by z.średni_zar

Posortowanie, czyli zdefiniowanie listy par (ulica, średni_zar)

first( UlicaŚrZarobekPosortowany() ).ulicaPobranie pierwszego elementu tej listy, odnawigowanie do jego składowej

Page 4: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 4

Całość zapytania w jednym kawałku

Zapytanie jest skomplikowane i niełatwo jest ustalić jego znaczenie. Powstaje problem jego dekompozycji, która może być skutecznie załatwiona wyłącznie poprzez pojęcia perspektywy, metody funkcyjnej i obliczeń pośrednich. Niestety, ODMG nie definiuje tych pojęć. Nie jest jasne, jak ODMG rozumie podane na poprzednim slajdzie definicje: czy to są makrodefinicje, czy to są funkcje, czy to jest jeszcze coś innego.

first( select z from ( select ulica,

średni_zar: avg( x.p.zarobek from partition as x)from ( select (Pracownik) q from Osoby as q

where “pracuje” in q.co_robi ) as pgroup by ulica: p.adres.ulica) as z

order by z.średni_zar).ulica

Page 5: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 5

Nazwane zapytania

define id(x1, x2, ..., xn) as e(x1, x2, ..., xn) delete definition id

define wiek(x) asselect osob.wiek from Osoba as osobwhere osob.nazwisko = x

define Kowalscy asselect x from Osoba as x where x.nazwisko = “Kowalski”

delete definition wiek

Definicja obowiązuje i jest przechowywana jako trwała dana od momentu kiedy użytkownik ją wprowadził.

Definicja realizuje własność określaną zwykle jako perspektywa (view).

• Czy definicja jest makro-definicją, czy też definicją procedury funkcyjnej?• Czy dopuszczalna jest rekursja? Jaka jest metoda przekazywania parametrów?• Czy parametr może być dowolnym zapytaniem, czy też jest prostą wartością?• W jakim środowisku jest przechowywana ta definicja? Wirtualne atrybuty? • Czy jest dostępna dla wszystkich użytkowników? Problem zaśmiecenia!• Dlaczego definicja nie podlega obowiązkowej specyfikacji typów?• Czy definicja ma samodzielne znaczenie pojęciowe? Aktualizacja perspektyw?

Wątpliwości:

select k.imię, wiek( k )from Kowalscy as k

Page 6: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 6

Binarne porównania i operatory

Operatory arytmetyczne na liczbach integer +, -, *, /, modOperatory arytmetyczne na liczbach float +. -, *, /Operatory porównania =, !=, <, <=, >, >=Operatory boolowskie and, orOperatory porównania znaków i stringów || (+), c in s, s[i], s[low;up], likePorównanie obiektów =, !=

count(Osoby) - count( Studenci)

‘przyjemny ciąg znaków’ like ‘%jemny%znak?w’ Wyrażenie zwraca true.

‘przyjemny ciąg znaków’[5;15] Zwraca string ‘emny ciąg z’

Jan = element( select s from Studenci where x.imię = “Jan” )

Page 7: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 7

Selekcja atrybutu, przechodzenie wzdłuż związku

e.p e->p

e - wyrażenie zwracające obiektp - nazwa atrybutu, związku, lub operacji na obiekcie

Rudzki -> liczba_studentów

Maciura -> uczestniczy_w kursie( “matematyka”, Rudzki ) -> nazwa

Rudzki jest obiektem typu Profesor, który posiada metodę liczba_studentów:

Maciura jest obiektem typu Student, który posiada metodę uczestniczy_w kursie posiadającej dwa parametry: nazwa kursu i obiekt typu Profesor; metoda zwraca obiekt typu Kurs, który ma atrybut nazwa.

Page 8: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 8

Kwantyfikatory

Uniwersalny

Egzystencjalny

for all x in e1 : e2(x)

for all x in Students: x.id_studenta > 0

exists x in e1 : e2(x)

Zapytanie zwraca true, jeżeli dla wszystkich studentów identyfikatory są dodatnie.

exists x in Maciura . uczęszcza : x . jest_prowadzony . nazwisko = “Rudzki”

Czy Maciura uczęszcza na jakikolwiek kurs prowadzony przez Rudzkiego?

StudentKurs

Profesor

Page 9: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 9

Operatory (funkcje) zagregowane

Identyczne jak w SQL:min, max, count, sum, avg

<operator> ( <zapytanie> )

max( select zarobek from Profesorowie )

count( Osoby )

min( select avg(select y from x.ocena as y ) from Studenci as x )

Minimalna średnia ocena studentów (ocena jest atrybutem studenta typu bag<integer>)

Page 10: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 10

Zdanie Select From Where

select [distinct] f( x1, x2, ..., xn, xn+1, xn+2, ..., xn+p )from e1(xn+1, xn+2, ..., xn+p ) as x1,

e2(x1, xn+1, xn+2, ..., xn+p ) as x2 ,e3(x1, x2, xn+1, xn+2, ..., xn+p ) as x3 ,...en(x1, x2, xn-1, xn+1, xn+2, ..., xn+p ) as xn

[where p( x1, x2, ..., xn, xn+1, xn+2, ..., xn+p )][order by f1(x1, x2, ..., xn+p ), f2(x1, x2, ..., xn+p ), ... , fq(x1, x2, ..., xn+p ) ]

xn+1, xn+2, ..., xn+p są wolnymi zmiennymix1, x2, ..., xn są zmiennymi zdefiniowanymi w tym zdaniu

(który są wolne w wyrażeniach f, p, fi i ei )

Składnia jest podobna do SQL, lecz semantyka jest zasadniczo różna. Po słowie from znajduje się nie iloczyn kartezjański, lecz wyrażenie określane jako zależne złączenie (dependent join). Zależne złączenie oznacza, że każdy następny fragment korzysta z definicji zmiennych ze wszystkich poprzednich fragmentów.

Podana definicja budzi kontrowersje:

•Duży syntaktyczny zlepek, sprzeczny z zasadą ortogonalności•Nieprecyzyjna definicja zależnego złączenia (zakresy nazw)•Ogólna nieporadność, tępota stylu definicji

as można opuścić.Alternatywnie,można użyć x in e(...)

Page 11: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 11

Przykład Select From Where

select para( student: x.nazwisko, profesor: z.nazwisko )

from Studenci as x, x.uczęszcza_na as y, y.jest_wykładany_przez as z

where z . stopień_naukowy = “profesor”

Student

Kurs

Wykładowcastopień_naukowy

Osobanazwisko

uczęszczajest_wykładany_przez

Studenci

Zależne złączenie znacznie upraszcza zapytania (w porównaniu do SQL). Niestety, ODMG dopuszcza stosowanie tego operatora wyłącznie w kontekście zdania select, co wprowadza nieortogonalność i redukuje możliwości wyszukiwawcze operatora.

x

y

z

Page 12: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 12

Operator grupowaniaKalka z SQL o bardzo kontrowersyjnej, mętnej składni i semantyce.

• Wyjaśnienie semantyki tego operatora jest mętne i niespójne (nie da się zrozumieć).• Obecność frazy group_by zmienia semantykę poprzedzającej ją frazy select, co jest nie do przyjęcia• Reguły migracji wolnych zmiennych do i od wyrażenia < atrybuty dzielące> przeczą zasadzie modularności semantyki.• Obecność specjalnego słowa kluczowego partition spowoduje trudności z zagnieżdżaniem zapytań

<zapytanie select> group by <atrybuty dzielące> [ having <predykat> ]

Semantyka: Dla każdego elementu z wyniku <zapytania select> ustalana jest wartośćwyrażenia <atrybuty dzielace>. Następnie wynik jest dzielony na grupy zgodnie z identyczną wartością zwracaną przez <atrybuty dzielace>. <predykat> może odrzucić niektóre z tych grup. Wyrażenie po select jest obliczane dla każdej z grup.

select departament, śr_zarobków: avg( select x.p.zarobek from partition as x )from Pracownicy as pgroup by departament: p.nr_departhaving avg( select x.p.zarobek from partition as x) > 3000

Page 13: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 13

Uporządkowanie, operatory na tablicach i listach

<zapytanie_select> order by e1, e2, ..., en

Rezultat zapytania można uporzadkować, tj, zmienić jego typ z set lub bag na list.

select os from Osoby as os order by os.wiek, os.nazwisko

select * from Osoby as os order by os.wiek desc, os.nazwisko asc, nr_działu

list(a, b, c, d )[1]<lista>[i] Zwraca i+1 -szy element listy, np. zwraca b.

Naiwny stosunek do problemu sortowania, nie uwzględniający narodowych konwencji.Listy są numerowane od zera: atawizm z arytmetyki wskaźników języka C.

element( select x from Kursy as x where x.nazwa = “projektowanie” and x.numer = “101” ) . poprzedniki[2]

Podaj trzeci poprzednik kursu projektowania o numerze 101:

list(a, b, c, d )[1:2]<lista>[i : j] Zwraca podlistę, np. zwraca list(b,c).

Page 14: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 14

Operacje na zbiorach

Suma, przecięcie, różnica, porównanie zbiorów o dość standardowym znaczeniu.

Suma, przecięcie, różnica, porównanie wielozbiorów o dość standardowym znaczeniu. (Możliwe jest znacznie więcej operatorów.)

Student except AsystentStudenci z wyjątkiem tych, którzy są jednocześnie asystentami

bag( 2, 2, 3, 3, 3 ) union bag( 2, 3, 3 ) Zwraca bag( 2, 2, 2, 3, 3, 3, 3, 3 )

set( 1, 2, 3 ) < set( 3, 4, 2, 1 ) Zwraca true

set( 1, 2, 3 ) < set( 3, 2, 1 ) Zwraca false

set( 1, 2, 3 ) <= set( 3, 2, 1 ) Zwraca true

Przy dowolnych operacjach na zbiorach lub wielozbiorach konieczne jest określenie identyczności elementów. Taka identyczność nie zawsze jest jednoznaczna dla obiektów. ODMG ignoruje ten problem.

distinct( list( 1, 4, 2, 3, 2, 4, 1, 3 ) )

Zwraca set( 1, 2, 3, 4 )

Page 15: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 15

Reguły zakresuUstalają, w jakim zakresie obowiązuje pewna powołana zmienna (kiedy jej definicja przestaje obowiązywać) i jaki jest priorytet wiązania do zmiennych jeżeli ich nazwy są takie same.

Jest to kluczowy problem, szczególnie w sytuacji, kiedy pewien użytkownik może skorzystać z zapytania (lub definicji) skonstruowanego przez innego użytkownika, włączając to zapytanie jako składową większego zapytania.

Dlaczego jest to problem?

Może się zdarzyć, że po zagnieżdżeniu w większe zapytanie, zagnieżdżane zapytanie zmieni swoją semantykę. Może się także zdarzyć, że zagnieżdżone zapytanie zmieni semantykę kontekstu (większego zapytania).

Reguły zakresu dla języków programowania są oparte o regułę stosu, który dyscyplinuje kontekst, w którym obowiązują definicje/deklaracje pewnych nazw. Ta reguła musi także obowiązywać dla języków zapytań.

Propozycja ODMG w kilku miejscach łamie regułę stosu, np. definicje wewnątrz frazy from obowiązują wewnątrz frazy group by, która wprowadza definicje obowiązujące globalnie.ODMG w ogóle nie wspomina o regule stosu; zamiast tego wprowadza mętne i niespójne dywagacje, które pachną totalną niekompetencją w zakresie tego tematu.

Page 16: Bazy danych  i inżynieria oprogramowania

K.Subieta. Bazy danych i inżynieria oprogramowania, Wykład 11, Folia 16

Podsumowanie OQL ost 6.01.04

Zalety:

Wady:

• Umożliwia formułowanie zapytań dla złożonego modelu obiektowego• Posiada składnię i semantykę przypominającą SQL (zaleta dla pewnych ludzi)• Zakłada mocną kontrolę typu.

• Ograniczenia modelu obiektowego (brak możliwości deklarowania wielu interfejsów do tego samego obiektu)• Jest mało ortogonalny, bazuje na dużym zlepku syntaktycznym• Posiada bardzo nieprecyzyjną semantykę, szczególnie w zakresie deklaracji pomocniczych nazw i reguł zakresu• Jako skutek, ograniczenia w zakresie optymalizacji zapytań• Nie jest zintegrowany z konstrukcjami aktualizacyjnymi i abstrakcjami programistycznymi (perspektywa, funkcja, procedura, metoda)• Nie zajmuje się danymi nietrwałymi (nie spełnia warunku ortogonalnej trwałości)• Ma wadliwie skonstruowane dziedziny semantyczne (brak referencji)• Wykazuje naiwny, nieprecyzyjny stosunek do takich zagadnień jak wartości zerowe, unie, grupowanie, uporządkowanie, mocne typowanie, wielodziedziczenie, ekstensje, i innych.