klasy
Transkrypt
klasy
BAZY DANYCH model obiektowy Opracował: dr inż. Piotr Suchomski Wprowadzenie Relacyjny model danych jest zbyt płaski i prosty do reprezentacji danych o bardziej skomplikowanej i nieregularnej strukturze (p. dane multimedialne). W teorii baz danych istnieją inne modele, za pomocą których można lepiej odwzorować rzeczywiste obiekty danych. Głównym, alternatywnym do relacyjnego modelu danych jest model obiektowy. Obiektowy model danych Obiektowa koncepcja baz danych bazuje na rozszerzonej koncepcji obiektowych języków programowania takich jak C++ czy Java o mechanizmy zapewniające trwałość danych. W czasie wykładu zostanie przedstawiony „czysty” model obiektowy ODL – Object Definition Language, zdefiniowany przez organizację ODMG – Object Data Managment Group) Cechy obiektowości Rozbudowany system typów, Pojęcie klasy, które są typami związanymi z ekstensją lub zbiorem obiektów należących do danej klasy. Klasa oprócz atrybutów, które mogą być typami atomowymi lub złożonymi, może zawierać metody, które są procedurami stosowanymi do obiektów danej klasy. Tożsamość obiektu (jednoznaczny identyfikator) niezależna od jego wartości. Dziedziczenie, które pozwala tworzyć hierarchiczną organizację klas, w której klasy niższe dziedziczą właściwości klasy wyższej. System typów Można korzystać z typów atomowych (liczby całkowite, rzeczywiste, łańcuchy znaków, typy logiczne itp.) Korzystając z tzw. konstruktorów typów można tworzyć nowe typy: System typów Typ struktury służy do tworzenia typu rekordu. Analogicznie jak „struktury” w języku C i C++ składają się z określonej liczby pół, a każde pole jest określonego typu. Typ kolekcji – gdy jest dany jakiś typ T to za pomocą różnych operatorów kolekcji można utworzyć np. tablice, listy, zbiory (np. lista liczb całkowitych, zbiór liczb naturalnych, tablica rekordów itp.) Typ referencji – Referencją do typu T jest typ, którego wartości jednoznacznie wskazują na wartości typu T (wskaźniki). Identyfikacja obiektu W modelu obiektowym zakłada się, że każdy obiekt posiada dokładnie jeden, niepowtarzalny identyfikator (OID – object identity). W modelu obiektowym mogą istnieć dwa obiekty o takich samych wartościach ale różnych identfikatorach. Metody i hermetyzacja Klasa może, ale nie musi, posiadać funkcje/metody pozwalające przetwarzać dane obiektów danej klasy. Dzięki metodom możliwa jest realizacja hermetyzacji (encapsulate). Ograniczony jest dostęp bezpośredni do danych obiektów. Wszystkie operacje na danych wykonywane są wyłącznie za pomoca metod. Takie rozwiązanie pozwala zabezpieczyć obiekty danych przed modyfikacjami jakich nie przewidział projektan bazy. Hermetyzacja jest jedną z podstaw tworzenia niezawodnego oprogramowania. Hierarchia klas - dziedziczenie Pewna klasa C może być podklasą klasy D. Podklasa C dziedziczy wszystkie własności oraz metody klasy D włącznie z jej typem. W klasie C mogą być zdefiniowane dodatkowe własności oraz metody lub metody klasy C mogą zastępować metody klasy D. Jezyk ODL Język ODL jest standardowym językiem do specyfikowania struktury bazy danych w terminologii obiektowej. Stanowi on rozszerzenie języka IDL (Interface Description Language), który jest składnikiem standardu CORBA (Common Object Request Broker Architecture) – znany standard obiektowego przetwarzania rozproszonego. Projekt klas w ODL W skład projektu klas w języku ODL wchodzą 3 składniki: – Atrybuty – wartości związane z obiektami danej klasy, – Związki – opisują powiązanie danego obiektu z obiektami innych klas, – Metody – funkcje, które pozwalają przetwarzać dane obiektów danej klasy. Atrybuty, związki i metody tworzą własności klasy. Atrybuty W modelu obiektowym atrybuty nie muszą być typu atomowego. Class Film{ attribute string tytul; attribute integer rok_prod; attribute integer czas_trwania; attribute enum dźwięk{mono, stereo, DD, SDDS} standardDzwieku; }; Class Aktor{ attribute string nazwisko; attribute Struct Adr{miasto, ulica, nr_domu} adres; }; Typy w języku ODL Typy atomowe – typy całkowite, zmiennoprzecinkowe, łańcuchy znaków, logiczne, wyliczeniowe. Nazwy klas, Typy strukturalne powstają z typów bazowych za pomocą tzw. konstruktorów typów (tzw. typy kolekcji): – Zbiór – Jeżeli T jest nazwą jakiegoś typu, to Set<T> oznacza typ, którego wartość są dowolnymi skończonymi zbiorami elementów typu T. W zbiorze każdy element występuje tylko raz. Typy w języku ODL – 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. W wielozbiorze element może występować wielokrotnie. – Lista - Jeżeli T jest nazwą jakiegoś typu, to L1st<T> oznacza typ, którego wartości są dowolnymi skończonymi listami zero lub więcej elementów typu T. Szczególny przypadek stanowi typ strlng, który jest skrótowym zapisem typu List<char>. W liście ważny jest porządek elementów np. {3,5,3} i {3,3,5} to takie same wielozbiory, ale różne listy. – Tablica - Jeśli T jest nazwą typu oraz i jest nazwą typu integer, to Array<T, i> oznacza typ, którego elementami są tablice i elementów typu T. Typy w języku ODL – Słownik - jeśli T i S są typami, to Dictionary<T,S> oznacza typ, którego wartościami są skończone zbiory par. Każda para składa się z wartości klucza typu T oraz wartości zakresu typu S. W słowniku nie mogą wystąpić dwie pary z taką samą wartością klucza. Z założenia metoda implementacji słownika jest efektywna w sensie wyszukiwania wartości z zakresu typu S na podstawie określonej wartości t klucza typu T. – Struktura – (analogicznie jak w języku C i C++) posiada pola, które mogą być również złożonego typu. Związki Związki pozwalają określić powiązania z innymi obiektami tej klasy lub innej klasy. Class Film{ attribute string tytul; attribute integer rok_prod; attribute integer czas_trwania; attribute enum dźwięk{mono, stereo, DD, SDDS} standardDzwieku; relationship Set<Aktor> aktorzy; }; W każdym obiekcie typu Film istnieje zbiór referencji do obiektów klasy Aktor. Związki odwrotne Bardzo często istnieje potrzeba wyrażenia tego, że istnieje związek odwrotny do zadeklarowanego związku (np. w danym filmie występują różni aktorzy, ale każdy aktor może występować w różnych filmach). Jeżeli związek R w klasie C wiąże obiekt x klasy C ze zbiorem jednego lub więcej obiektów y1, y2, … ,yn klasy D, to związek odwrotny do R wiąże z każdym z obiektów yi obiekt x. Związki odwrotne Class Film{ attribute string tytul; attribute integer rok_prod; attribute integer czas_trwania; attribute enum dźwięk{mono, stereo, DD, SDDS} standardDzwieku; relationship Set<Aktor> obsada inverse Aktor::zagrałW; }; Class Aktor{ attribute string nazwisko; attribute Struct Adr{miasto, ulica, nr_domu} adres; relationship Set<Film> zagrałW inverse Film::obsada; Krotność związków Analogicznie jak w przypadku związków E/R para związków odwrotnych może być wiele do wiele, wiele do jeden, jeden do wiele i jeden do jeden. m:n między klasami C i D typem związku w klasie C jest Set<D>, a w klasie D typem związku jest Set<C>; n:1 z klasy C do D typem związku w C jest D, a w klasie D typem związku jest Set<C>; 1:n (odwrotnie niż w punkcie poprzednim); 1:1 typem związku w C jest D, a w D jest C. Związki wieloargumentowe ODL wspiera tylko związki binarne. Związki wieloargumentowe należy zamienić na wiele związków binarnych. Metody Metody stanowią fragment kodu wykonywalnego na obiektach danej klasy. W ODL można zadeklarować nazwy metod związanych z daną klasą oraz typy wejść/wyjść (sygnatury). Kod funkcji nie jest elementem języka ODL. Kod metody zapisywany jest w języku podstawowym. Deklaracja metod występuje w deklaracji klasy razem z atrybutami i związkami. Tak jak w językach programowania metoda jest związana z daną klasą i działa na obiektach tej klasy Metody - syntaktyka Syntaktyka deklaracji jest zbliżona do języka C. Dodatkowo rozszerzona została o dwa elementy: – Parametry metod określane są dyrektywami in, out oraz inout. Wartości parametrów out i inout mogą być zmieniane i dlatego są przekazywane przez referencję, natomiast parametr in jest niezmienny i jest przekazywany przez wartość. Ponadto (tak jak w C) metoda może zwrócić wartość. – W metodzie mogą pojawiać się tzw. wyjątki – odpowiedzi na zdarzenia nietypowe, nie mieszczące się w standardowym mechanizmie komunikacji przez zwracane parametry. W ODL wyjątki oznaczane są słowem kluczowym raises. Metody class Film{ attribute string tytul; … relationship Set<Aktor> obsada inverse Aktor::zagrałW; … float DługośćWGodzinach() reises(brakDługości) void PokażObsadę(out Set<string>); void DorobekGwiazdy(in Aktor, out Set<Film>) raises (brakTakiegoAktora) } Dziedziczenie - podklasy W standardzie ODL dziedziczenie oznaczane jest słowem kluczowym extends. Class Animowany extends Film{ attribute enum AnimTyp{2D, 3D, poklatkowa} typAnimacji; relationship Set<Aktor> dubbing inverse Aktor::udzieliłGłosu; } Każdy obiekt klasy Animowany posiada własności klasy Film oraz dodatkowo własne właściwości (atrybut i związek). Dziedziczenie wielokrotne Mimo, że w rzeczywistości mogą istnieć obiekty, które posiadają cechy kilku klas, nie można w technice obiektowej tworzyć obiektów, które przynależą do kilku klas. Należy zdefiniować inną klasę, która będzie dziedziczyć po kilku klasach. Class KomediaAnimowana extends Komedia: Anmimowany; W przypadku dziedziczenia mnogiego istnieje potencjalny konflikt nazw własności, które w różnych klasach nadrzędnych mogą nazywać się tak samo. Potrzebny jest mechanizm, który wskaże o jaką własność klasy bazowej chodzi. Dziedziczenie mnogie - konflikty Można unikać (bądź nieudostępnić) mechanizmu dziedziczenia po wielu klasach. Opracowanie mechanizmu, który pozwoli wskazać, z której klasy bazowej własność o podanej nazwie ma być dziedziczona. Można tą własność w nowej klasie przejąć pod inną, unikatową nazwą. Ekstensje Należy odróżnić definicję klasy od jej obiektów. Sytuacja analogiczna do odróżnienia schematu relacji od jej instancji. W standardzie ODL rozróżnienie to jest jawne – klasie i obiektom nadaje się różne nazwy. Nazwa klasy określa schemat klasy, a ekstensja identyfikuje zbiór obiektów danej klasy. Class Film (extent Filmy){ attribute string tytul; … }; Deklaracja kluczy w ODL W technice obiektowej jednoznaczna identyfikacja obiektu odbywa się na podstawie jego identyfikatora, dlatego definiowanie kluczy w tym modelu jest opcjonalne (niedopuszczalne w modelu E/R i relacyjnym). Można zadeklarować jeden bądź kilka kluczy używając słowa kluczowego key bądź keys. Class Student (extent Studenci keys (nazwisko, data_ur), nr_indeksu){ … }; Przejście do modelu relacyjnego ODL może być stosowany do stworzenia pierwotnego projektu bazy danych, który przed implementacją jest przekształcany do postaci relacyjnej. Konwersja ta przypomina pod wieloma względami przejście od modelu E/R do schematu relacyjnego. Mimo, że w modelu obiektowym łatwiej i dokładniej można zamodelować rzeczywistość to przekształcenie do modelu relacyjnego – łatwiejszego w implementacji, obarczone jest kilkoma problemami, które na etapie tego przejścia trzeba rozwiązać. Typowe problemy przekształcenia W modelu relacyjnym wymagane jest bezwzględnie określenie kluczy, które w modelu obiektowym są opcjonalne. Często istnieje konieczność definiowania dodatkowych atrybutów, które mogą tworzyć klucze. W modelu relacyjnym atrybuty muszą być atomowe. Przekształcenie atrybutów typu kolekcji do postaci atomowej wymaga wielu sztuczek, które wymagają późniejszej normalizacji. Istnieje poważna trudność konwersji metod do postaci relacyjnej Przekształcenia atrybutów Przekształcenie atrybutów atomowych jest zagadnieniem trywialnym. W przypadku struktury przekształca się jej pola do postaci atrybutów relacji. Class Student (extent Studenci){ attribute string nazwisko; attribute Struct Adr{string miasto, string ulica, integer nr_domu}adres; } Studenci(nazwisko, miasto, ulica, nr_domu) Przekształcenia atrybutów Najwięcej trudności sprawia przekształcenie atrybutów typu kolekcji (zbiór, wielozbiór, lista, tablica itp.). Każdy typ posiada specyficzny sposób konwersji. Jedna z metod reprezentowania zbioru wartości atrybutu A polega na utworzeniu dla każdej wartości odpowiadającej jej krotki. Taka krotka zawiera wówczas stosowne wartości wszystkich pozostałych atrybutów klasy. Niestety taka technika zastępowania obiektów atrybutami o wartościach zbiorowych przez kolekcje krotek, po jednej dla każdej kombinacji wartości tych atrybutów może prowadzić do postaci nieznormalizowanych. Przekształcanie atrybutów Class Aktor(extent Aktorzy){ attribute string nazwisko; attribute Set<Struct Adr{string miasto, string ulica}> adres; }; nazwisko miasto ulica Carrie Fischer Hollywood 123 Mapie St . Carrie Fischer Malibu 5 Locust Ln. Mark Hamill Brentwood 456 Oak Rd. Harrison Ford Beverly Hills 789 Palm Dr. Przekształcenie wielozbiorów W przypadku wielozbiorów metoda przekształcenia dla zbiorów komplikuje się, ponieważ w bazie krotki nie mogą się powtarzać. Rozwiązaniem tego problemu jest wprowadzenie dodatkowego atrybutu np. licznika, który będzie przechowywał informację o ilości identycznych krotek. Model obiektowo-relacyjny Model obiektowy nie znalazł szerszego wykorzystania w praktycznej implementacji systemów baz danych. Nie nastąpił rozwój obiektowych systemów baz danych kosztem relacyjnych baz danych. Jednak od lat 90 obserwuje się tendencję wykorzystywania niektórych zalet podejścia obiektowego w relacyjnych systemach baz danych. To spowodowało wyodrębnienie się grupy obiektowo-relacyjncyh baz danych. Rozszerzenie modelu relacyjnego Atrybuty nie muszą być atomowe. Dużą uwagę skupia się na zbiorach struktur, które same w sobie tworzą relację. Składową krotki może być cała relacja. Wykorzystanie metod. Można zdefiniować i stosować specjalne operacje dla typów zdefiniowanych przez użytkownika. Identyfikatory krotek. Krotki odgrywają rolę obiektów. Zazwyczaj identyfikator krotki jest ukryty, ale w specyficznych sytuacjach może być widoczny. Referencje - wskaźniki do krotek. Od ODL do modelu obiektoworelacyjnego Znacznie prostsza jest konwersja z modelu obiektowego do obiektowo-relacyjnego niż do modelu relacyjnego ze względu na wprowadzone rozszerzenia (nieatomowe atrybuty, metody, referencje itp.). Reprezentacja związków w modelu obiektoworelacyjnym jest taka sama jak w modelu relacyjnym. Problem tłumaczenia modelu z metodami do czystego modelu relacyjnego w przypadku modelu obiektowo-relacyjnego praktycznie nie