Język zapytań dla obiektowego modelu baz danych
Język OQL (Object Query Language)
Podstawowa klauzula:
SELECT
FROM
WHERE
Przykład:
Diagram klas przedstawiający korporację:
Pytanie 1:
Podaj wszystkie firmy, których wszystkie oddziały są zlokalizowane w tym samym miejscu co
zarząd.
SELECT Firma
WHERE EACH Oddziały-Lokalizacja = Lokalizacja
Pytanie 2:
Podaj wszystkie firmy, których co najmniej jeden oddział jest zlokalizowany w tym samym
miejscu co zarząd.
SELECT Firma
WHERE EXISTS Oddziały-Lokalizacja = Lokalizacja
Pytanie 3:
Podaj wszystkie firmy, których oddziały są fabrykami samochodów lub ciężarówek.
SELECT Firma
WHERE EACH Oddziały-Funkcja IS-IN („Fabryka samochodów”, „Fabryka ciężarówek”)
Ścieżka:
Do kojarzenia klas służy ścieżka o postaci:
atrybut1 – atrybut2 – atrybut3 – …
lub
zmienna – atrybut1 – atrybut2 – atrybut3 – …
Zmienna:
1. Zmienna związana przez predykat przynależności
.
Pytanie 4:
Podaj wszystkie firmy mające co najmniej jeden oddział, w którym jest zatrudniony co
najmniej jeden pracownik, którego miejscem zamieszkania jest Rzym i który jest właścicielem
samochodu Ferrari”.
SELECT C
FROM Firma: C, Oddział: D, Pracownik: E
WHERE D IS-IN C-Oddziały AND
E IS-IN D-Personel AND
E-Właściciel_pojazdu-Producent-Nazwa = “Ferari” AND
E-Adres = „Rzym”
Bardziej uproszczona postać:
SELECT C
FROM Firma: C, E IS-IN C-Oddziały-Personel
WHERE E-Właściciel_pojazdu-Producent-Nazwa = “Ferari” AND
E-Adres = „Rzym”
2. Zmienna referencyjna
Pytanie 5:
Podaj wszystkie firmy mające co najmniej jeden oddział, w którym jest zatrudniony co
najmniej jeden pracownik, którego miejscem zamieszkania jest Rzym i który jest właścicielem
niebieskiego samochodu wyprodukowanego przez firmę zlokalizowaną w Mediolanie.
SELECT C
FROM Firma: C, E IS-IN C-Oddziały-Personel, D IS E-Właściciel_pojazdu
WHERE E-Adres = „Rzym” AND
D-Kolor = “niebieski” AND
D-Producent-Lokalizacja = „Mediolan”
3. Zmienna referencyjna może określać zbiór
Pytanie 6:
Podaj wszystkie firmy, w których wszyscy pracownicy jeżdżą samochodami ze zbioru (Fiat,
Ferrari) lub ze zbioru (Ford, Opel, Nissan).
SELECT C
FROM Firma: C, S IS C-Oddziały-Personel-Właściciel_pojazdu
WHERE S-Producent-Nazwa IS-SUBSET (“Fiat”, “Ferrari”) OR
S Producent-Nazwa IS-SUBSET (“Ford”, “Opel”, “Nissan”)
Hierarchia klas:
Użytkownik powinien mieć możliwość decydowania o tym, czy dziedzina zapytania ma być
pojedyncza klasa, czy hierarchia klas zakorzeniona w danej klasie.
Pytanie 7:
Podaj wszystkie firmy, które są zlokalizowane w Rzymie.
SELECT Firma*
WHERE Lokalizacja = „Rzym”
Można wykluczyć z hierarchii klasę (klasy)
Pytanie 8:
Podaj wszystkie firmy oprócz firm produkujących ciężarówek, które są zlokalizowane w
Rzymie.
SELECT Firma* DIFFERENCE Firma Ciężarówek
WHERE Lokalizacja = „Rzym”
Materiał opracowany na podstawie:
Won Kim: Wprowadzenie do obiektowych baz danych. WNT 1996.
Ćwiczenia:
1. Podaj wszystkie firmy, których prezes mieszka w tym samym miejscu co zarząd firmy.
2. Podaj wszystkie firmy, których wszyscy pracownicy mają samochody produkowane
przez ich firmy.
3. Podaj pracowników, którzy mają samochody o kolorze czerwonym
4. Podaj oddziały, których pracownicy mają wiek w przedziale 20-30.
Więzy integralności
Więzy integralności: są to warunki, które mają być spełnione przez dane. Jeśli wszystkie
więzy są spełnione przez dane, wówczas mówimy, że stan bazy danych jest spójny.
W modelu relacyjnym więzy są najczęściej wyrażane za pomocą formuł logicznych.
Natomiast w modelu obiektowym, ze względu na złożoność danych, więzy integralności są
wyrażane za pomocą języka zapytań.
Rodzaje więzów integralnościowych:
1. Więzy dotyczące dziedzin atrybutów
2. Więzy dotyczące obiektów z jednej klasy
3. Więzy dotyczące relacji między klasami
Metody:
- Firma: Liczba_Odziałów(): Int; Osobowość_prawna(): Boolean
Język OCL (Object Constraint Language)
Język OCL (Object Constraint Language) jest językiem specyfikacji do zapisu ograniczeń
w modelu obiektowym. Jest on częścią języka UML - standardu przeznaczonego do
analizy i projektowania obiektowego.
1. Niezmienniki klas
- Dla dowolnej klasy można podać jej niezmiennik (ang. invariant) w
postaci zbioru wyrażeń.
- Każde wyrażenie niezmiennicze jest wyrażeniem boolowskim, tzn.
może być wartościowane jako prawda lub fałsz.
- Dla więcej niż jednego wyrażenia przyjmuje się, że niezmiennik
jest koniunkcją tych wyrażeń.
- Niezmiennik danej klasy oznacza, że wszystkie obiekty tej klasy
spełniają zadany niezmiennik.
- Niezmiennik oznaczamy słowem kluczowym inv.
Przykład:
context
Pracownik inv:
wiek > 17
wiek < 65
Niezmiennik ten oznacza, że dla wszystkich obiektów klasy
Pracownik wartość atrybutu wiek jest większa od 17 i jest mniejsza od
65.
2. Odwołania do atrybutów i metod
W wyrażeniach możemy odwoływać się do wartości atrybutów klasy
oraz do rezultatów działania takich operacji, które nie mają skutków
ubocznych.
context Firma inv:
- self.nazwa <> ' ' and self.lokalizacja <> ' ' ;
- nazwa <> ' ' and lokalizacja <> ‘Wrocław’;
- self.Liczba_Odziałów() >= 10;
- Liczba_Odziałów() >= 10;
- self.Osobowość_prawna();
- Osobowość_prawna() and lokalizacja <> ‘Wrocław’;
Słowo kluczowe self wskazuje na dowolny obiekt zadany przez
kontekst (tutaj obiekt klasy Firma). Można je pomijać, o ile wyrażenie
pozostaje jednoznaczne.
3.
Odwołanie do obiektu powiązanego przez nawigację
Poprzez użycie ścieżek.
context
Firma inv:
self.prezes.nazwisko <> '' ;
self.prezes.wlaściciel_pojazdu.produc
ent.nazwa = self.nazwa ;
4.
Odwołanie do kolekcji obiektów
Powiązanie może odnosić się do wielu obiektów danej klasy, zgodnie z
krotnością zapisaną na końcu powiązania. Odwołania przy użyciu takiego
powiązania dotyczą wówczas kolekcji obiektów. Za pomocą operatora
kolekcyjnego '->' zapisujemy operacje, które wykonujemy na kolekcji obiektów.
context
Firma inv:
self.Oddziały -> size() <= 5
Niezmiennik określa, że liczba elementów kolekcji (tzn. liczba oddziałów) nie
przekracza 5. Size() jest standardową operacją na kolekcji
.
5.
Iteracje po elementach kolekcji
Wybrane operacje kolekcyjne (np. select, forAll, exists) obliczają zadane
wyrażenie dla wszystkich elementów kolekcji. Możliwe są trzy formy składni
tych operacji:
- kolekcja -> operacja (element:Typ | <wyrażenie>)
- kolekcja -> operacja (element | <wyrażenie>)
- kolekcja -> operacja (<wyrażenie>)
Na przykład operacja select sprawdza wszystkie elementy kolekcji i zwraca
kolekcję tych elementów, które spełniają zadane wyrażenie boolowskie.
samochód -> select (a: Pracownik | a.właściciel_pojazdu.kolor
= ‘niebieski’) ;
wiek-pr -> select (a: Pracownik | a.wiek < 50) ;
6. Warunki początkowe i końcowe transakcji
context Klasa::Metoda(): Boolean
pre: warunek przed transakcją
post: warunek po transakcji
Przykład:
context Faktura::Czy_wystawić(x): Boolean
Faktura_K -> select (a: Faktura | a.Klient.Id = x.Klient.Id
AND NOT Płatość(a));
pre: isEmpty(Faktura_K)
post: x.brutto < 50.000
7. Operacje na typach kolekcyjnych
size()
- liczba elementów w kolekcji
count(obiekt)
- liczba wystąpień obiektu
includes(obiekt) - True, jeśli obiekt jest elementem
isEmpty()
- True, jeśli brak elementów
sum()
- suma wszystkich elementów (np. Real lub Integer)
exists(wyrażenie)
- True, jeśli wyrażenie jest spełnione przynajmniej
przez jeden element
forAll(wyrażenie)
- True, jeśli wyrażenie jest spełnione przez wszystkie
elementy
select(wyrażenie) - kolekcja elementów spełniających wyrażenie
union(kolekcja)
- łączy zbiór ze zbiorem lub wielozbiorem, ciąg z
ciągiem
Warunek 1:
Wiek prezesa nie może przekroczyć 50.
Warunek 2:
Samochód prezesa musi być wyprodukowany przez swoją firmę.
Warunek 3:
Prezes powinien mieszkać w tym samym miejscu co siedziba zarządu
Warunek 4:
Liczba pracowników każdego z oddziałów nie może przekroczyć 50.