Obiekty w bazie danych są instancjami klas z metodami i dziedziczeniem. Obiekty są gromadzone w tabelach obiektowych.
Tabela obiektowa - tabela, której elementami są obiekty ustalonej klasy: wiersz -> obiekt tzn. wiersz tabeli relacyjnej uzyskuje metody i tożsamość obiektową i staje się obiektem.
Wartością atrybutu może być wartość złożona jak np. lista wartości, zbiór wartości, rekord, referencja do innego obiektu.
Model obiektowo-relacyjny w Visio
- na przykładzie
Dwa typy obiektowe: Typ_adresowy i Typ_osoby.
Tabela Osoby zawierającą zbiór obiektów typu Typ_osoby.
Każda osoba ma:
trzy skalarne atrybuty: imie, nazwisko oraz data_ur oraz
dwa atrybuty typu obiektowego:
adres – typu Typ_adresowy oraz
szef – referencja do obiektu typu Typ_osoby.
Modelowanie dziedziczenia atrybutów dla typów.
Modelowanie kolekcji - na przykładzie kolekcji osób
Set
– nieuporządkowana kolekcja wartości bez powtórzeń.
MultiSet
- nieuporządkowana kolekcja wartości z powtórzeniami.
List
- uporządkowana kolekcja wartości z powtórzeniami.
ODL - język modelowania obiektowo-relacyjnych baz danych
(Object Definition Language)
Język ODL przypomina składnię języka C++, zatem tłumaczenie do języka obiektowego jest proste.
Podstawowym pojęciem jest obiekt. Zakłada się, że każdy obiekt posiada jednoznaczny identyfikator (OID), który odróżnia go od innych obiektów. Obiekty o podobnych cechach są grupowane w klasy.
Specyfikując schemat klasy w języku ODL opisujemy trzy rodzaje właściwości:
Atrybuty, są to właściwości, których typy powstają z typów pierwotnych takich jak całkowity lub tekstowy. Atrybuty nie odnoszą się do żadnej klasy.
Związki, typy tych właściwości są albo referencjami do obiektu pewnej klasy, albo kolekcjami (np. zbiór) takich referencji.
Metody, są to funkcje operujące na obiektach danej klasy.
Przykład deklaracji klasy w ODL
interface Film{
attribute string tytuł;
attribute integer rok;
attribute integer długość;
attribute enum Taśma
{kolor, czarno-biała} TypTaśmy;
}
Typ TypTaśmy jest typem wyliczeniowym o dwóch wartościach {kolor, czarno-biała}. Obiekty klasy Film to krotki (układy wartości) odpowiadające poszczególnym czterem atrybutom np. (“Przeminęło z Wiatrem”, 1939, 231, kolor).
Przykład określenia klasy z atrybutem typu złożonego
interface Gwiazda{
attribute string nazwisko;
attribute Struct Adr {string ulica, string miasto} adres;
};
Atrybut adres ma strukturę rekordu, nazwą tego typu złożonego jest Adr, a składa się on z dwóch pól: ulica oraz miasto. Oba pola są typu tekstowego. Rekord w języku ODL definiuje się poprzez podanie słowa kluczowego Struct oraz listy nazw pól i ich typów ujętej w nawiasy klamrowe.
Specyfikacja związku między obiektami klas
interface Film{
attribute string tytuł;
attribute integer rok;
attribute integer długość;
attribute enum Taśma
{kolor, czarno-biała} TypTaśmy;
relationship
Set<Gwiazda> obsada;
};
W każdym obiekcie klasy Film występuje zbiór referencji do obiektów klasy Gwiazda - obsada. Słowo kluczowe Set, które poprzedza napis <Gwiazda>, wskazuje, że pole obsada zawiera referencje do zbioru obiektów typu Gwiazda, a nie do jednego tylko obiektu.
W języku ODL typ, który jest zbiorem elementów typu T, definiuje się poprzez podanie słowa kluczowego Set oraz nazwy typu T otoczonej nawiasami kątowymi. Możliwa interpretacja atrybutu obsada - lista wskaźników do obiektów klasa Gwiazda (na podstawie obiektu klasy Film można uzyskać listę gwiazd występujących w tym filmie).
Specyfikacja związku
odwrotnego
Równie ważną informacją jest w jakich filmach występuje dana gwiazda filmowa co można uzyskać specyfikując w definicji klasy Gwiazda:
relationship Set<Film> wystepujeW;
W ten sposób nie można jednak opisać bardzo ważnego związku pomiędzy filmami i gwiazdami:
jeśli gwiazda S należy do obsady filmu M, to film M należy do zbioru filmów, w których występuje gwiazda S
Ten rodzaj związku między dwiema klasami możemy określić poprzez dodanie do deklaracji tego związku słowa kluczowego inverse opatrzonego nazwą drugiego związku. Jeśli, jak to jest zazwyczaj, ten drugi związek należy do innej klasy, to jego nazwę musi poprzedzić napis złożony z nazwy jego klasy oraz podwójnego dwukropka (::).
interface Gwiazda{
attribute string nazwisko;
attribute Struct Adr {string ulica, string miasto} adres;
relationship Set<Film> wystepujeW inverse Filmy::obsada
};
Związek między filmami i gwiazdami jest wieloznaczny. Odpowiada to przy określaniu powiązania między zbiorami obiektami dwóch klas użyciu w definicji obu klas słowa kluczowego set. Gdy set będzie użyte tylko raz - mamy do czynienia ze związkiem jednoznacznym. Gdy ani razu - ze związkiem jedno-jednoznacznym.
Przykład definicji związku jednoznacznego
interface Film{
attribute string tytuł;
attribute integer rok;
attribute integer długość;
attribute enum Taśma
{kolor, czarno-biała} TypTaśmy;
relationship
Set<Gwiazda> obsada inverse Gwiazda::wystepujeW;
relationship Gwiazda supergwiazda inverse
Gwiazda::wybitne;
};
interface Gwiazda{
attribute string nazwisko;
attribute Struct Adr {string ulica, string miasto} adres;
relationship Set<Film> wystepujeW inverse Film::obsada;
relationship Set<Film>
wybitne inverse Film::supergwiazda;
};
Typy w języku ODL
Typy atomowe: całkowity, zmiennoprzecinkowy, znakowy, tekstowy, logiczny i wyliczeniowy. Korzystanie z tego ostatniego typu polega na zdefiniowaniu listy synonimów dla wartości typu całkowitego.
Typ interfejs, na przykład Film lub Gwiazda, przeznaczony do opisu klas obiektów.
Typy strukturalne tworzy się z typów bazowych poprzez zastosowanie następujących konstruktorów typów:
Zbiór. Jeżeli T jest nazwą jakiegoś
typu, to
Set<T>
oznacza typ, którego wartości są dowolnymi skończonymi
zbiorami wartości typu T.
Wielozbiór. Jeżeli T jest nazwą
jakiegoś typu, to
Bag<T>
oznacza typ, którego wartości są
dowolnymi skończonymi zbiorami z powtórzeniami (wielozbiorami)
wartości typu T. Zbiory z powtórzeniami różnią się od zwykłych zbiorów
tym, że dany element może się powtarzać. Na przykład {1,2,1} jest
zbiorem z powtórzeniami, ale nie jest zbiorem, ponieważ 1 występuje więcej
niż raz.
Lista. Jeżeli T jest nazwą jakiegoś
typu, to
List<T>
oznacza typ, którego wartości są dowolnymi skończonymi
listami wartości typu T. Szczególny przypadek stanowi tu typ string, który
jest skrótowym zapisem typu List<char>.
Tablica. Jeśli T jest nazwą typu, i
jest stałą typu integer, to
Array<T,i>
oznacza typ, którego
elementami są tablice i-elementów typu T. Na przykład
Array<char,10> oznacza napis o długości 10 znaków.
Struktura. Jeśli T1, T2,
...,Tn są typami, a F1,F2,..., Fn są
nazwami pól, to
Struct Name {T1 F1,T2
F2,...,Tn Fn}
oznacza nowy typ o nazwie
Name, którego
elementy są strukturami złożonymi z n pól. i-te pole nazywa się Fi
i jest typu Ti. Na przykład typ strukturalny o nazwie Addr w
definicji interfejsu Gwiazda, jest złożony z dwóch pól ulica i miasto typu
string.
Specyfikacja metody
interface Pracownik{
attribute string nazwisko;
attribute TypPłci Enum{mężczyzna, kobieta} Płeć;
attribute Date dataUrodzenia;
short
Wiek();
};
Specyfikacja dziedziczenia
interface Profesor : Pracownik{
attribute string StopieńNaukowy;
};