background image

Język zapytań dla obiektowego modelu baz danych 

 
 

Język OQL (Object Query Language)  

 
 
Podstawowa klauzula: 
 
 

 

SELECT 

 

 

FROM 

 

 

WHERE 

 

background image

 
Przykład: 
 
Diagram klas przedstawiający korporację: 
 
 

 

 
 
 

background image

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 – …  

 
 
 
 
 
 

background image

 

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” 

 
 
 

background image

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” 

background image

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) 
 
 

background image

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.

background image

Ć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. 

 
 
 
 
 
 
 
 

background image

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 

background image

 

 

 

 

 
 
 

Metody: 
 
- Firma: Liczba_Odziałów(): Int; Osobowość_prawna(): Boolean

 

 
 
 
 

background image

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. 

background image

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. 

background image

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 ; 
 

 

background image

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

 . 

background image

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) ; 
 

background image

 

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 

 

background image

 

 

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  

 

 

background image

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.