Perspektywy
Transkrypt
Perspektywy
170 Bazy danych Perspektywy Bazy danych Przegląd zagadnień Podstawowe wiadomosci o perspektywach i ich wlasnosciach Tworzenie i uzytkowanie perspektyw Podsumowanie Pytania sprawdzajace Laboratorium 171 172 Bazy danych Podstawowe wiadomości o perspektywach i ich własnościach Co to jest perspektywa W jakim celu stosujemy perspektywy Rodzaje perspektyw W najprostszym rozumieniu perspektywa (ang. view) jest wirtualną tabelą. Przyjrzyjmy się jednak perspektywom dokładniej. W szerokim znaczeniu perspektywa (zwane teŜ często widokiem) jest odwzorowaniem globalnego schematu bazy danych na schemat "zewnętrzny" przystosowany do potrzeb i przyzwyczajeń konkretnego uŜytkownika. Takie ujęcie perspektywy ilustruje następujący rysunek Rys. 8.1 Schemat funkcjonowania perspektywy Bazy danych 173 W jakim celu stosujemy perspektywy? Generalnie po to, aby uprościć (sobie lub uŜytkownikowi) Ŝycie. Powodów stosowania perspektyw jest wiele: • • • • • uproszczenie z punktu widzenia uŜytkownika modeli pojęciowych dzięki temu moŜemy znacznie uprościć schemat bazy, a tym samym ułatwić uŜytkownikowi dostęp do danych, dostosowanie się do punktu widzenia i terminologii dziedziny zastosowań BD - zmiana schematu wprowadzana przez perspektywę moŜe być wykorzystana na przykład do dostosowania nazw tabel i kolumn do języka, którym posługuje się uŜytkownik, ograniczenie dostępu do obiektów - perspektywy powodują ukrycie przez uŜytkownikiem końcowym prawdziwego schematu bazy danych; moŜe to mieć równieŜ pozytywny wpływ na poprawę bezpieczeństwa danych, gdyŜ uŜytkownik nie ma bezpośredniego dostępu do schematu rzeczywistego, współdziałanie systemów heterogenicznych (wspólny schemat) – w wypadku systemów rozproszonych, zbudowanych z róŜnych systemów baz danych perspektywa moŜe pomóc w ukryciu róŜnic, przystosowanie starszych systemów do nowszych technologii i wymagań. Z punktu widzenia uŜytkownika (i innych procesów) perspektywa powinna być dla niego przezroczysta, to znaczy, Ŝe moŜna na niej wykonywać takie same operacje jak na "prawdziwych" tabelach. Warunek przezroczystości perspektyw jest bardzo trudny do spełnienia, gdyŜ dla pewnych odwzorowań danych zapamiętanych w wirtualne przyjęte środki definicji perspektyw (np. SQL) mogą okazać się niewystarczające, a takŜe dlatego, Ŝe problem aktualizacji perspektyw pozostaje nierozwiązany. Rys. 8.2 Schemat funkcjonowania perspektywy 174 Bazy danych Rodzaje perspektyw Perspektywy dzielimy na dwie grupy: • • perspektywy wirtualne, perspektywy zmaterializowane. Perspektywy wirtualne Perspektywa wirtualna istnieje wyłącznie w postaci definicji. Wyliczenie (czyli wyznaczenie zbioru krotek danej perspektywy zwane teŜ materializacją perspektywy) następuje w momencie odwołania się do perspektywy. Wynik ten nie jest później nigdzie przechowywany. Oznacza to, Ŝe kaŜde wywołanie perspektywy wirtualnej powoduje jej ponowne wyliczenie (materializację), co obciąŜa zasoby systemu. Wadą perspektyw wirtualnych jest obciąŜanie systemu za kaŜdym odwołaniem do procedury wirtualnej, a tym samym czas (czasem znaczny) oczekiwania na materializację perspektywy. Perspektywy wirtualne mają teŜ szereg zalet. W sytuacji stosowania perspektyw wirtualnych nie ma dublowania danych oraz problemów z aktualizacją danych i problemów z przetwarzaniem transakcji. Procedury zmaterializowane Perspektywa zmaterializowana jest wyliczana (materializowana) w czasie pierwszego uŜycia. Następnie wynik tego wyliczenia (dane) są przechowywane, aby móc ich uŜyć przy ponownym wywołaniu perspektywy. Dzięki temu kolejne wywołanie perspektywy nie obciąŜa systemu, a czas dostępu do danych znacznie się zmniejsza. Niestety perspektywy zmaterializowane niosą ze sobą równieŜ problemy związane przede wszystkim z aktualizacją danych, zwiększeniem zapotrzebowania na miejsce w pamięci i dodatkowe obciąŜenia przy realizacji transakcji. Tworzenie i uŜytkowanie perspektyw Bazy danych Tworzenie perspektyw Modyfikacja danych z pomoca perspektyw Indeksowanie perspektyw 175 176 Bazy danych Metody tworzenia perspektyw Metody tworzenia i zastosowania perspektyw pokaŜemy na przykładzie. ZałóŜmy, Ŝe w bazie danych jest przechowywana następująca tabela: Pracownicy (Id_pracownika, Imię, Nazwisko, Stanowisko, Kierownik, Data_zatrudnienia, Zarobki, Premia, Id_działu) Zbudujemy teraz perspektywę, która będzie zawierała tylko urzędników zatrudnionych w tej firmie, a dodatkowo zrezygnujemy z części nieistotnych dla nas atrybutów (uproszczenie schematu) CREATE VIEW Urzednicy( Id_pracownika, Imię, Nazwisko, Zarobki) AS SELECT Id_pracownika, Imię, Nazwisko, Zarobki FROM Pracownicy WHERE Stanowisko = ‘urzednik’ Jeśli teraz chcielibyśmy sprawdzić zarobki urzędnika na przykład o nazwisku Nowak, to moŜemy wykorzystać do tego celu zdefiniowaną perspektywę w sposób następujący: SELECT Zarobki FROM Urzednicy WHERE Nazwisko = ‘Nowak’ Jak widać, odwołanie do perspektywy następuje tutaj tak, jak byśmy odwoływali się do "prawdziwej" tabeli. Co więcej, na samej tylko podstawie instrukcji SELECT nie jesteśmy w stanie określić, czy tabela Urzędnicy, do której się odwołujemy, jest tabelą zapisaną w bazie, czy teŜ jest tabelą wirtualną (perspektywą). Inny przykład definicji perspektywy pokazuje rysunek poniŜej. Rys. 8.3 Definicja prostego widoku Bazy danych 177 Perspektywa moŜe teŜ być definiowana na podstawie innej perspektywy lub kilku tabel. Przykład perspektywy zdefiniowanej na podstawie dwu tabel pokazano na rysunku . Rys. 8.4 Widok stworzony z kilku tabel Podczas przetwarzania perspektywy przez SZBD moŜe wystąpić jedna z niŜej przedstawionych metod. Metoda materializacji perspektywy Metoda materializacji polega na tym, Ŝe w momencie gdy sterowanie programu dotrze do miejsca kodu, w którym występuje odwołanie do definicji perspektywy, następuje jej wyliczenie. KaŜde odwołanie do perspektywy powoduje jej ponowne wyliczenie (w celu uniknięcia sytuacji, w której dane rzeczywiste nie pokrywają się z danymi w perspektywie). Optymalizacja czasu wykonania tą metodą moŜe polegać na wykorzystaniu perspektyw zmaterializowanych. Metoda modyfikacji zapytań W metodzie tej system analizuje tekst całego zapytania przed jego wykonaniem. W czasie analizy w miejsce wywołania perspektywy wstawiana jest jego definicja i ewentualnie wykonywana optymalizacja zapytania. Strategia modyfikacji zapytań daje (choć nie zawsze) lepsze rezultaty niŜ strategia materializacji perspektyw. Strategia modyfikacji jest stosowana przez prawie wszystkie relacyjne SZBD. Wykorzystanie strategii modyfikacji zapytań do optymalizacji zapytania pokazano poniŜej. 178 Bazy danych Rys. 8.5 Strategia modyfikacji zapytań Modyfikacja danych za pomocą perspektyw Utworzenie perspektywy (inaczej widoku) nie powoduje utworzenia kopii danych. Widok jest "szablonem", za pomocą którego wyświetlamy dane. Modyfikacja danych widoku polega więc w rzeczywistości na modyfikacji danych w tabelach będących źródłem danych dla widoku. Istnieje kilka ograniczeń co do modyfikacji danych przy uŜyciu widoków: • • • • • widok uŜywany do modyfikacji danych nie moŜe zawierać funkcji grupujących, jednym poleceniem moŜna modyfikować w widoku tylko kolumny pochodzące z jednej tabeli (lub dodawać dane do jednej tabeli), modyfikowane dane nie mogą być wartościami obliczonymi na podstawie wartości innych kolumn, wstawienie nie moŜe naruszać warunków narzuconych w tabelach źródłowych (dotyczy to takŜe, a moŜe w szczególności, pól tabeli, które nie wchodzą w skład widoku - jeśli mają one ustawione opcję NOT NULL, to przy pomocy widoku nie moŜna do tej tabeli wstawić nowych danych), wstawiane dane muszą być zgodne z warunkiem WITH CHECK OPTION w definicji widoku. W celu modyfikacji danych przedstawianych wykorzystujemy polecenie UPDATE według schematu: przez UPDATE <nazwa_perspektywy> SET <nazwa_kolumny> = '<wartość_zmieniana>' WHERE <nazwa_kolumny> = '<nowa_wartość>' perspektywę Bazy danych 179 Indeksowanie Perspektyw Perspektywa indeksowana to perspektywa, na której zdefiniowano indeks grupowany (jako Ŝe pierwszym indeksem na perspektywie musi być indeks grupowany, zaś następnie moŜemy tworzyć indeksy niegrupowane). W takim przypadku zbiór danych generowany przez widok jest materializowany i przechowywany w najniŜszym poziomie stron naleŜących do indeksu, tak jak to ma miejsce w przypadku indeksu grupowanego zdefiniowanego na tabeli. RównieŜ operacje modyfikacji danych w indeksowanym widoku odbywają się w podobny sposób, jak w tabelach z indeksami (następuje przebudowanie indeksu). Gdy tworzymy indeks na perspektywie, pojęcie wirtualnej tabeli przestaje być aktualne w odniesieniu do perspektywy, poniewaŜ teraz perspektywa jest materialnym zbiorem danych przechowywanym w bazie danych. Widok musi spełniać następujące wymagania, by moŜna było określić na nim indeks grupowany: 1. w trakcie tworzenia perspektywy muszą być włączone opcje ANSI_NULLS i QUOTED_IDENTIFIER, 2. - w trakcie tworzenia tabel bazowych widoku musi być włączona opcja ANSI_NULLS, 3. podczas tworzenia widoku (CREATE VIEW) musi zostać uŜyta opcja SCHEMABINDING, 4. tylko dwie części nazw (właściciel.obiekt - w normalnej sytuacji nazwy mogą mieć więcej członów) mogą zostać uŜyte w definicji widoku do odwoływania się do obiektów bazy danych (tabel lub funkcji uŜytkownika), 5. jeśli uŜywamy funkcji w definicji widoku, to muszą być to funkcje deterministyczne, 6. wszystkie nazwy kolumn muszą być jawnie (i tylko raz) określone w widoku (niedopuszczalny jest symbol gwiazdki), 7. widok nie moŜe zawierać kolumn typów: text, ntext oraz image, 8. widok nie moŜe zawierać danych z tabel zagnieŜdŜanych, funkcji zwracających zestawy rekordów, złączeń typu UNION, złączeń zewnętrznych (OUTER JOIN) oraz złączeń tabeli z samą sobą (ang. self join), 9. polecenie SELECT w definicji widoku nie moŜe zawierać klauzul TOP, ORDER BY, DISTINCT, COMPUTE, COMPUTE BY, HAVING, CUBE oraz ROLLUP, 10. w poleceniu SELECT w definicji funkcje agregujące mogą wystąpić tylko wtedy, gdy uŜyta jest klauzula GROUP BY; nie mogą zostać uŜyte złoŜone funkcje agregujące, czyli: AVG, MIN, MAX, STDEV, STDEVP, VAR oraz VARP, 11. nie moŜna uŜyć funkcji COUNT(*) (ale moŜna COUNT_BIG(*)). Tworzenie indeksu na perspektywie odbywa się tak samo, jak to ma miejsce w przypadku tabel, przykład: CREATE UNIQUE CLUSTERED INDEX high_sales_UCI ON High_Sales_View (orderid, customerid, productid) 180 Bazy danych Podsumowanie Co to jest perspektywa Jak i gdzie uzywamy perspektywy Jakie sa korzysci z perspektyw Problemy w pracy z widokami Perspektywa jest odwzorowaniem jednego schematu bazy na inny schemat. O perspektywach moŜemy myśleć tak jak o wirtualnych tabelach, które w większości wypadków zachowują się tak samo jak tabele rzeczywiste. Do najwaŜniejszych korzyści wynikających ze stosowania perspektyw naleŜą: • ułatwienie uŜytkownikom dostępu do danych, • ograniczenie dostępu do danych chronionych, • maskowanie złoŜoności bazy danych, • uproszczenie złoŜonych zapytań, w tym zapytań rozproszone na heterogenicznych danych, • uproszczenie zarządzania uprawnieniami uŜytkowników. Bazy danych 181 Laboratorium Przećwiczmy teraz zdobytą wiedzę. Dokonamy teraz operacji stworzenia perspektywy oraz wyświetlenia i modyfikacji danych za jej pomocą. 182 Bazy danych Tworzenie perspektywy υ Zaloguj się do maszyny wirtualnej ZBD jako uŜytkownik Administrator z hasłem P@ssw0rd. υ Kliknij Start. Z grupy programów Microsoft SQL Server 2005 uruchom SQL Server Management Studio. υ W oknie logowania kliknij Connect. υ Kliknij w menu głównym programu Management Studio na File. υ Kliknij Open - File. υ Odszukaj plik C:\Labs\Lab08\mod8.sql i kliknij Open. υ Następnie klikamy przycisk New Query znajdujący się w prawymgórnym roku okna aplikacji. υ W części środkowej pojawiło nam się okno o nazwie nazwa_serwera…SQLQuery.sql. W oknie tym będziemy wpisywać wszystkie polecenia języka T-SQL. υ Kolejnym krokiem jest wpisanie i wykonanie (przycisk Execute) następującego kodu: USE Biblioteka GO CREATE VIEW widok_ksiazki_wydawnictwa AS SELECT Ksiazki.tytul, Ksiazki.rok_wydania, Wydawnictwa.wydawnictwo FROM Ksiazki INNER JOIN Wydawnictwa ON Ksiazki.ID_wydawnictwa = Wydawnictwa.ID_wydawnictwa GO SELECT * FROM widok_ksiazki_wydawnictwa GO Wykonanie powyŜszego kodu spowoduje utworzenie w bazie danych Biblioteka widoku o nazwie widok_ksiazki_wydawnictwa, który będzie zawierał dwie kolumny z tabeli Ksiazki (kolumnę tytul oraz kolumnę rok_wydania) oraz jedną kolumnę z tabeli Wydawnictwa (kolumnę wydawnictwo). Polecenie SELECT wyświetla dane w widoku. tytul rok_wydania wydawnictwo ---------------------------------------------- ----------- ----------SQL Server 2000. Vademecum Administratora 2001 Windows Server 2003. Vademecum Administratora 2003 UML w kropelce 2002 MS Access wersja 2002 dla ekspertów 2003 XML na powaŜnie 2002 MS Press MS Press LTP MS Press Helion Dokonajmy modyfikacji danych w kolumnie Wydawnictwo tak aby nazwa MS Press została zamieniona na Promise. W tym celu naleŜy: υ υ W Management Studio kliknąć przycisk New Query W znanym nam oknie wpisać i wykonać następujący kod UPDATE widok_ksiazki_wydawnictwa SET wydawnictwo = 'Promise' WHERE wydawnictwo = 'MS Press' GO SELECT * FROM Wydawnictwa GO Bazy danych 183 Wynikiem wykonania powyŜszego kodu jest wyświetlenie zawartości tabeli Wydawnictwa. ID_wydawnictwa wydawnictwo -------------- ----------1 Promise 2 LTP 3 Helion Jak widać na pozycji pierwszej w kolumnie wydawnictwo mamy wartość "Promise" zamiast dotychczasowej "MS Press". Czyli tak naprawdę modyfikacji nie ulegają dane w widoku, ale w jednej z tabel wykorzystywanych w definicji widoku. Dodawanie danych za pomocą perspektyw Umiemy juŜ modyfikować dane w naszej bazie za pomocą widoku. Spróbujmy teraz dodać nowe dane. W tym celu w nowym oknie SQLQuery wpisz i wykonaj następujący kod: INSERT INTO widok_ksiazki_wydawnictwa(tytul,rok_wydania,wydawnictwo) VALUES ('SQL Server','2000','Promise') GO Wynikiem próby wykonania powyŜszego kodu jest błąd mówiący o tym, Ŝe nie moŜemy zmodyfikować danych w widoku, poniewaŜ polecenie usiłuje modyfikować dane w więcej niŜ jednej tabeli bazowej widoku. Aby poradzić sobie z ta niedogodnością stwórzmy nieco zmodyfikowany widok. W nowym oknie SQLQuery wpisz i wykonaj następujący kod: CREATE VIEW widok_ksiazki_wydawnictwa_2 AS SELECT Ksiazki.tytul, Ksiazki.rok_wydania, Ksiazki.ID_wydawnictwa, Wydawnictwa.wydawnictwo FROM Ksiazki INNER JOIN Wydawnictwa ON Ksiazki.ID_wydawnictwa = Wydawnictwa.ID_wydawnictwa GO SELECT * FROM widok_ksiazki_wydawnictwa_2 GO Wynikiem wykonania powyŜszego kodu jest utworzenie widoku o nazwie widok_ksiazki_wydawnictwa_2 podobnego do poprzednio utworzonego widoku widok_ksiazki_wydawnictwa. Jedyną zmianą w budowie widoku jest włączenie do widoku kolumny ID_wydawnictwa z tabeli Ksiazki. Nowy widok prezentuje się następująco: tytul rok_wydania ID_wydawnictwa wydawnictwo ---------------------------------------------- ----------- -------------- ----------SQL Server 2000. Vademecum Administratora 2001 1 Promise Windows Server 2003. Vademecum Administratora 2003 1 Promise UML w kropelce 2002 2 LTP MS Access wersja 2002 dla ekspertów 2003 1 Promise XML na powaŜnie 2002 3 Helion 184 Bazy danych Teraz moŜna dodać dane do bazy za pomocą naszego widoku. W oknie SQLQuery wpisz i wykonaj następujący kod: INSERT INTO widok_ksiazki_wydawnictwa_2(tytul,rok_wydania,ID_wyd awnictwa) VALUES ('SQL Server','2000',1) GO SELECT * FROM widok_ksiazki_wydawnictwa_2 GO Wynikiem wykonania powyŜszego kodu jest wstawienie nowego wiersza do tabeli Ksiazki (mimo, Ŝe wstawiamy dane w widok). PowyŜszą operację moŜemy wykonać, poniewaŜ w tabeli Wydawnictwa istnieje wiersz mający w kolumnie ID_wydawnictwa wartość 1 (tabela Ksiazki korzysta z tej kolumny na potrzeby własnej kolumny - klucza obcego ID_wydawnictwa). Gdybyśmy usiłowali jednocześnie wstawić nieistniejące wydawnictwo, polecenie INSERT zwróciłoby błąd. Tym razem wynikiem wykonania zapytania SELECT jest wyświetlenie danych z widoku widok_ksiazki_wydawnictwa_2 z nowo dodanym wierszem. tytul rok_wydania ID_wydawnictwa wydawnictwo ---------------------------------------------- ----------- -------------- ----------SQL Server 2000. Vademecum Administratora 2001 1 Promise Windows Server 2003. Vademecum Administratora 2003 1 Promise UML w kropelce 2002 2 LTP MS Access wersja 2002 dla ekspertów 2003 1 Promise XML na powaŜnie 2002 3 Helion SQL Server 2000 1 Promise