Bazy danych i inżynieria oprogramowania
description
Transcript of 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
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
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
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
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
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” )
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.
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
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>)
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(...)
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
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
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).
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 )
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.
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.