Obiektowo-relacyjne bazy danych

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

 

 

Modelowanie dziedziczenia atrybutów dla typów.

 

Modelowanie kolekcji - na przykładzie kolekcji osób

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:

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

  2. Związki, typy tych właściwości są albo referencjami do obiektu pewnej klasy, albo kolekcjami (np. zbiór) takich referencji.

  3. 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
                };

 

Liczebność związku

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

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

  2. Typ interfejs, na przykład Film lub Gwiazda, przeznaczony do opisu klas obiektów. 

  3. Typy strukturalne tworzy się z typów bazowych poprzez zastosowanie następujących konstruktorów typów:

 

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