Obiekt ID =5 Dziecko Obiekt ID =2 Pracownik Dzieci = 4, 3, 6 Obiekt

Transkrypt

Obiekt ID =5 Dziecko Obiekt ID =2 Pracownik Dzieci = 4, 3, 6 Obiekt
Obiektowy model danych.
Obiektowy model danych wynika bezpośrednio z paradygmatu obiektowego.
Obiekty encji uŜywane w programach obiektowych są analogiczne do encji bazy danych uŜywanych w
bazach czysto obiektowych, z jedną istotną róŜnicą: obiekty programu znikają po zakończeniu jego
działania, a obiekty bazy danych pozostają.
Koncepcja ta nosi nazwę trwałości (ang. persistence). Na koncepcji trwałych obiektów opiera się
większość dzisiejszych czysto obiektowych systemów zarządzania bazami danych, w których deklaracje
klas są bardzo podobne do tych, jakie spotyka się w obiektowych językach programowania.
Deklaracje klas muszą jednak nie tylko wskazywać, Ŝe obiekty utworzone na ich podstawie są trwałe, lecz
równieŜ w jakiś sposób pokazać zaleŜności między obiektami.
Obiektowo-relacyjne bazy danych określane są równieŜ jako bazy postrelacyjne bądź teŜ hybrydowe.
Obiektowe relacje między danymi.
Obiektowa baza danych musi umoŜliwiać reprezentowanie nie tylko tradycyjnych relacji bazy danych
(„jeden do wielu" i „wiele do wielu"), ale takŜe relację „jest" wynikającą z dziedziczenia.
Identyfikatory obiektów.
W relacyjnej bazie danych relacje między danymi reprezentowane są poprzez konieczność
dopasowania danych klucza podstawowego i obcego. W bazie takiej nie ma struktur danych tworzących
powiązania między tabelami. Relacje uŜywane są w miarę potrzeb poprzez łączenie tabel.
Natomiast w czysto obiektowej bazie danych relacje zakodowane są „na sztywno", przez
umieszczenie wewnątrz obiektu identyfikatorów innych, powiązanych z nim obiektów.
Identyfikator obiektu jest wewnętrznym identyfikatorem bazy danych przypisywany kaŜdemu
obiektowi.
UŜytkownicy,
umoŜliwiający
programiści,
wykonywanie
zapytań,
czy
nigdy
teŜ
nie
uŜytkownicy
widzą
ani
obsługujący
bezpośrednio
interaktywny
nie
program
manipulują
tymi
identyfikatorami.
Identyfikatory obiektów są przydzielane i uŜywane tylko przez DBMS.
Identyfikatory mogą mieć róŜne znaczenie w róŜnych systemach zarządzania bazami danych. Mogą to być
dowolnie ustalone wartości lub informacje potrzebne do zlokalizowania obiektu w pliku bazy.
Przykład 1.
Prostokąty oznaczają pracowników, a elipsy dzieci. Wszystkie obiekty mają unikatowe identyfikatory. Jak
widać, kaŜdy identyfikator obiektu jest inny.
Obiekt ID =2
Pracownik
Dzieci = 4, 3, 6
Obiekt ID =5
Dziecko
Obiekt ID =1
Pracownik
Dzieci = 5
Obiekt ID =6
Dziecko
Obiekt ID =3
Dziecko
Obiekt ID =4
Dziecko
Obiekty klasy Pracownik mają atrybuty o nazwie Dzieci, które zawierają atrybuty w postaci
identyfikatorów dzieci pracowników.
Wnioski :
-
identyfikator obiektu nie moŜe się zmienić, tylko wówczas mechanizm ten będzie działał.
-
przy przeszukiwaniu bazy danych ( zapytania ) mogą być wykorzystane tylko te relacje, które
zostały uprzednio zdefiniowane przez zapisanie ich w atrybutach identyfikatorów powiązanych
obiektów,
czyli obiektowa baza danych ma charakter nawigacyjny, podobnie jak wcześniejsze
hierarchiczne i sieciowe modele danych.
Pod tym względem obiektowy model danych jest krokiem wstecz, poniewaŜ ogranicza elastyczność
działań programisty lub uŜytkownika do tych predefiniowanych relacji.
Dlatego obiektowe bazy danych generalnie nie nadają się tak dobrze do zapytań ad hoc jak bazy
relacyjne. Z kolei wyszukiwanie danych zgodnie ze ścieŜkami zdefiniowanymi przez relacje między
danymi, daje większą wydajność niŜ w przypadku bazy relacyjnej, gdyŜ lokalizowanie obiektów za
pomocą identyfikatorów jest o wiele szybsze niŜ łączenie tabel.
Relacje typu „jeden do wielu”.
Aby przedstawić relację „jeden do wielu", po stronie „wielu" relacji definiuje się atrybut klasy, w
którym
będzie
przechowywany
identyfikator
obiektu
macierzystego
(rodzica).
Klasa
obiektów
macierzystych ma atrybut, w którym znajdą się identyfikatory powiązanych z nią obiektów. Gdy DBMS
zobaczy atrybut, którego typ danych będzie inną klasą, zorientuje się, Ŝe atrybut ten słuŜy do
przechowywania identyfikatorów obiektów, a nie samych danych.
Aby na przykład powiązać pracowników z ich dziećmi, klasa Dziecko moŜe mieć atrybut o typie danych
Pracownik. Klasa Pracownik będzie zawierała atrybut typu Dziecko zadeklarowany jako zbiór wartości.
NaleŜy pamiętać, Ŝe chociaŜ relacja jest zdefiniowana przez atrybuty w klasie, to w samej bazie danych
relacje istnieją między obiektami, podobnie jak relacje klucz podstawowy - klucz obcy zachodzą między
określonymi rekordami, a nie całymi tabelami.
Relacje typu „wiele do wielu”
W obiektowej bazie danych obiekty mogą mieć atrybuty wielowartościowe, pozwala to na
bezpośrednie przedstawienie relacji „wiele do wielu", bez konieczności tworzenia złoŜonych encji do
usuwania zaleŜności. W kaŜdej klasie uczestniczącej w relacji definiowany jest atrybut zawierający zbiór
wartości innej klasy, z jaką będzie powiązany.
MoŜliwość tworzenia bezpośredniej reprezentacji zaleŜności „wiele do wielu" wydaje się zaletą
obiektowej bazy danych. Występują tu jednak pewne niedogodności.
Po pierwsze, mając powiązane dane, jak na przykład cenę towaru róŜną w zaleŜności od dostawcy, u
jakiego towar został zamówiony, konieczne będzie utworzenie encji złoŜonej przechowującej te dane.
Relacja „wiele do wielu" zostanie wtedy zastąpiona przez dwie relacje „jeden do wielu", podobnie jak w
relacyjnej bazie danych.
Po drugie, w bazie danych zawierającej relacje „wiele do wielu" moŜe występować utratę informacji
lub teŜ niemoŜność dokładnego określenie zaleŜności.
Przykład :
Mamy trzy klasy: Sklep, Klient i Towar, kaŜdy z kształtów reprezentuje obiekty innej klasy.
Linie na wykresie między obiektami wskazują, które obiekty są powiązane ze sobą.
Baza przedstawia klientów, którzy zakupili towary w określonych sklepach oraz towarów zakupionych
w tych sklepach. Zachodzi tutaj relacja „wiele do wielu" między klientem a sklepem oraz relacja „wiele
do wielu" między klientem a towarem (jest równieŜ relacja „wiele do wielu" między towarem a
sklepem, lecz w tej bazie nie ma ona znaczenia, o ile nie będzie powiązana z klientem, który zakupił
towar).
Z diagramu moŜna ustalić, Ŝe klient nr l zakupił towary nr l i nr 2 w sklepie nr l (jeden klient dokonuje
zakupów wielu towarów w jednym sklepie). Podobnie widać, Ŝe klient nr 2 dokonał zakupów w
sklepach nr l i nr 2 oraz Ŝe obydwa zakupy dotyczyły jednego towaru (jeden klient dokonuje zakupu
jednego towaru w wielu sklepach). W przypadku klienta nr 3 obraz nie jest juŜ tak jasny.
Klient nr 3 kupował zarówno w sklepie nr 2, jak i nr 3. Jednocześnie klient nr 3 zakupił towar nr 2 i
towar nr 3 (jeden klient dokonuje zakupów wielu towarów w wielu sklepach). W którym sklepie
klient nr 3 kupił poszczególne towary ?
Poprzez stosowanie relacji „wiele do wielu", straciliśmy informację: sklep, w którym został kupiony
określony towar.
Sklep 1
Klient 1
Produkt 1
Sklep 2
Sklep 3
Klient 2
Klient 3
Produkt 2
Produkt 3
Rozwiązaniem jest usunięcie relacji „wiele do wielu" między klientami a towarami przez wstawienie
złoŜonej encji reprezentującej zakup towaru przez klienta w sklepie.
Nowa klasa Zakup wiąŜe jeden lub więcej towarów z określonym klientem i sklepem. Nie ma teraz
wątpliwości, Ŝe klient nr 3 kupił towar nr 2 w sklepie 2 oraz Ŝe towar nr 3 pochodził ze sklepu nr 3.
Teraz dopiero relacja „wiele do wielu” nie powoduje utrat informacji. Jej stosowanie w obiektowym
modelu danych naleŜy jak widać dokładnie zaplanować.
Klient 2
Sklep 1
Sklep 2
Sklep 3
Zakup 3
Zakup 2
Zakup 5
Klient 1
Zakup 1
Zakup 4
Produkt 3
Klient 3
Produkt 1
Produkt 2
Widać wyraźnie, Ŝe Klient 3 kupił Produkt 2 w Sklepie 2 oraz Ŝe Produkt 3 został zakupiony w Sklepie 3.
Relacja „Jest „
PoniewaŜ paradygmat obiektowy obsługuje dziedziczenie, w obiektowej bazie danych między
obiektami moŜe równieŜ istnieć relacja „jest" (ang. is a).
Deklarujemy klasę Pracownik z następującymi atrybutami: nazwisko, adres, numer ubezpieczenia,
data zatrudnienia i dział.
Problem pojawia się przy rejestrowaniu sposobu wynagradzania pracownika, poniewaŜ jedni są
płatni za godziny, inni otrzymują pensję miesięczną.
Klasa dla pracowników płatnych za godziny wymaga atrybutów zawierających stawkę godzinową,
płacę za pracę w nadgodzinach oraz miesięczną normę godzin. Klasa dla pracowników wynagradzanych
miesięcznie wymaga tylko atrybutu przechowującego wysokość rocznego zarobku.
Prawidłowy sposób rozwiązania tego problemu polega na utworzeniu dwóch podklas klasy Pracownik,
po jednej dla kaŜdego rodzaju pracownika.
Obecność tych klas powoduje, Ŝe projekt staje się on bardziej czytelny, a ponadto ułatwia pracę
programistów, którzy mogą napisać metody uŜywane przez obie podklasy tylko raz, dla klasy Pracownik.
Relacja „rozszerza".
Teoria obiektowych baz danych obsługuje dwa rodzaje dziedziczenia :
relację „jest"
oraz
relację „rozszerza" (ang. extends).
Relacja „jest", tworzy hierarchię dziedziczenia, w której podklasy są szczególnymi typami ich klasy
bazowej.
W przypadku relacji „rozszerza" zachodzi natomiast rozszerzenie definicji podklasy względem klasy
bazowej, a nie jej zawęŜenie do bardziej szczególnego typu.
Dla przykładu wcześniejszego z klasą Pracownik, oprócz klas opisujących pracowników odmiennie
wynagradzanych, potrzebna jest jeszcze informacja o kierownikach, którzy równieŜ są pracownikami.
Tworzymy więc się klasę Kierownik z dodatkowym atrybutem (wielowartościowym ), w którym będą
zapisani pracownicy podlegający danemu kierownikowi. Kierownik jest pracownikiem o dodatkowych
cechach.
Klasa Kierownik rozszerza zatem definicję kaŜdej z klas związanych ze sposobem wynagradzania,
zamiast ją uszczegóławiać.
Relacja „całość-część".
Koncepcje części całości jest trudniej zaprezentować w relacyjnej bazie danych.
Przykład :
Jest baza danych w fabryce, w której mają być rejestrowane części i podzespoły uŜywane do wytwarzania
określonych produktów.
W obiektowej bazie danych moŜna natomiast wykorzystać relację zwaną „całość-część" ( wiele do
wielu), w której obiekty danej klasy powiązane są z obiektami innych klas wchodzących w jej skład.
W przykładowej bazie za pomocą relacji „całość-część" będzie powiązana klasa Produkt z klasami Część i
Podzespół.
Produkt moŜe składać się z wielu części i podzespołów. Podobnie ta sama część lub podzespół moŜe
być uŜyty w wielu róŜnych produktach.
Relacja „całość-część" ma bardziej szczególne znaczenie niŜ zwykła relacja „wiele do wielu" i moŜna
ją umieścić w dokumentacji projektu bazy, by ułatwić zrozumienie projektu.
Relacja między produktami, częściami i podzespołami jest w rzeczywistości trochę bardziej
skomplikowana , poniewaŜ podzespoły składają się z części, a same równieŜ mogą wchodzić w skład
większych podzespołów.
Integralność relacji.
Funkcjonowanie relacji w czysto obiektowych bazach danych, jest zaleŜne od zachowania zgodności
identyfikatorów obiektów po obu stronach relacji.
Jeśli na przykład istnieje powiązanie między pracownikami a ich dziećmi, wówczas musi istnieć
mechanizm zapewniający, Ŝe jeśli identyfikator obiektu klasy Dziecko zostanie wstawiony do obiektu
klasy Pracownik, wtedy identyfikator tego samego obiektu Pracownik będzie wstawiony do obiektu
Dziecko.
Integralność relacji, przypomina integralność powiązań w relacyjnym modelu danych i realizowana
jest poprzez określenie relacji odwrotnych (ang. inverse relationship).
Za integralność powiązań w relacyjnej bazie danych odpowiedzialny jest projektant, podobnie jak za
określenie relacji odwrotnych w obiektowej bazie danych.