Perl

920 views

Published on

Profesjonalny przewodnik po języku Perl

Ten kompletny przewodnik po Perlu szybko i wygodnie dostarcza doświadczonym programistom odpowiednich technik i ilustrujących je praktycznych przykładów kodu. Lektura tej książki pozwoli Ci najpierw rozwinąć swoje dotychczasowe umiejętności, a następnie zgłębić tajniki podstawowych technik programowania w Perlu. Książka rozpoczyna się opisem podstawowej składni języka, przechodzi później do obiektów, struktur danych i zasad przetwarzania tekstu. Następnie wyjaśnia, jak korzystać z dostarczonych przez Perl narzędzi umożliwiających pracę z plikami, działanie programów w sieci czy współpracę z relacyjnymi bazami danych. Na koniec pokazuje, jak wykorzystać pełnię możliwości Perla podczas tworzenia aplikacji WWW - zarówno prostych skryptów CGI, jak i w pełni zaawansowanych narzędzi obsługujących witryny WWW.

Opisano między innymi:

* Typy danych i podstawowe funkcje Perla
* Zasady pisania i korzystania z modułów Perla
* Sposoby korzystania z plików tekstowych i plików DBM
* Interfejs DBI pozwalający na korzystanie z baz danych i integrowanie baz danych ze stronami WWW
* Programy CGI, moduły mod_perl dla serwera Apache, cookie protokołu HTTP oraz szablony HTML/Perla
* Mason: oparty na Perlu system tworzenia zaawansowanych witryn WWW
* Wykrywanie i usuwanie błędów, optymalizacja kodu oraz sprawy związane z bezpieczeństwem

Od wielu już lat programiści na całym świecie doceniają Perla za jego prostotę, wygodę i uniwersalną zdolność do rozwiązywania szerokiego zakresu problemów; począwszy od przetwarzania tekstu i administrowania systemem operacyjnym po komunikację z bazami danych i tworzenie stron WWW. Książka "Perl" dostarcza programistom wiedzy niezbędnej do tworzenia wszechstronnych, przejrzystych i bardzo wydajnych programów - niezależnie jakie będą zadania tworzonych przez niego aplikacji.

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
920
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Perl

  1. 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI Perl KATALOG KSI¥¯EK Autor: Reuven M. Lerner T³umaczenie: M. Michalski, S. Dzieniszewski KATALOG ONLINE ISBN: 83-7361-169-X Tytu³ orygina³u: Core Perl ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 45 Przyk³ady na ftp: 61 kB TWÓJ KOSZYK DODAJ DO KOSZYKA Ten kompletny przewodnik po Perlu szybko i wygodnie dostarcza do wiadczonym programistom odpowiednich technik i ilustruj¹cych je praktycznych przyk³adów kodu. Lektura tej ksi¹¿ki pozwoli Ci najpierw rozwin¹æ swoje dotychczasowe umiejêtno ci, CENNIK I INFORMACJE a nastêpnie zg³êbiæ tajniki podstawowych technik programowania w Perlu. Ksi¹¿ka rozpoczyna siê opisem podstawowej sk³adni jêzyka, przechodzi pó niej do obiektów, ZAMÓW INFORMACJE struktur danych i zasad przetwarzania tekstu. Nastêpnie wyja nia, jak korzystaæ O NOWO CIACH z dostarczonych przez Perl narzêdzi umo¿liwiaj¹cych pracê z plikami, dzia³anie programów w sieci czy wspó³pracê z relacyjnymi bazami danych. Na koniec pokazuje, ZAMÓW CENNIK jak wykorzystaæ pe³niê mo¿liwo ci Perla podczas tworzenia aplikacji WWW — zarówno prostych skryptów CGI, jak i w pe³ni zaawansowanych narzêdzi obs³uguj¹cych witryny WWW. CZYTELNIA Opisano miêdzy innymi: • Typy danych i podstawowe funkcje Perla FRAGMENTY KSI¥¯EK ONLINE • Zasady pisania i korzystania z modu³ów Perla • Sposoby korzystania z plików tekstowych i plików DBM • Interfejs DBI pozwalaj¹cy na korzystanie z baz danych i integrowanie baz danych ze stronami WWW • Programy CGI, modu³y mod_perl dla serwera Apache, cookie protoko³u HTTP oraz szablony HTML/Perla • Mason: oparty na Perlu system tworzenia zaawansowanych witryn WWW • Wykrywanie i usuwanie b³êdów, optymalizacja kodu oraz sprawy zwi¹zane z bezpieczeñstwem Od wielu ju¿ lat programi ci na ca³ym wiecie doceniaj¹ Perla za jego prostotê, wygodê i uniwersaln¹ zdolno æ do rozwi¹zywania szerokiego zakresu problemów; pocz¹wszy Wydawnictwo Helion od przetwarzania tekstu i administrowania systemem operacyjnym po komunikacjê ul. Chopina 6 z bazami danych i tworzenie stron WWW. Ksi¹¿ka „Perl” dostarcza programistom 44-100 Gliwice wiedzy niezbêdnej do tworzenia wszechstronnych, przejrzystych i bardzo wydajnych tel. (32)230-98-63 programów — niezale¿nie jakie bêd¹ zadania tworzonych przez niego aplikacji. e-mail: helion@helion.pl
  2. 2. Spis treści Przedmowa .................................................................................................................................................. 9 Rozdział 1. Czym jest Perl? ........................................................................................................................15 1.1. Czym jest Perl?...................................................................................................... 15 1.2. Do czego Perl się nie nadaje? ................................................................................. 17 1.3. Licencje ................................................................................................................ 17 1.4. Wersje i standardy Perla......................................................................................... 18 1.5. Wsparcie techniczne .............................................................................................. 18 1.6. Pobieranie i instalacja Perla.................................................................................... 19 1.7. Pobieranie modułów z CPAN ................................................................................... 22 1.8. Podsumowanie ...................................................................................................... 25 Rozdział 2. Pierwsze kroki ....................................................................................................................... 27 2.1. Najprostsze programy............................................................................................. 28 2.2. Kompilator czy interpreter? ..................................................................................... 29 2.3. Wyrażenia i bloki.................................................................................................... 30 2.4. Zmienne................................................................................................................ 31 2.5. Skalary ................................................................................................................. 32 2.6. Listy i tablice ......................................................................................................... 41 2.7. Tablice asocjacyjne ................................................................................................ 48 2.8. Odwołania ............................................................................................................. 52 2.9. Zmienne leksykalne i globalne ................................................................................ 58 2.10. Podsumowanie .................................................................................................... 60 Rozdział 3. Kroki następne.........................................................................................................................61 3.1. Podstawowe funkcje wyjścia ................................................................................... 62 3.2. Czas ..................................................................................................................... 64 3.3. Podstawowe funkcje wejścia ................................................................................... 65 3.4. Operacje warunkowe .............................................................................................. 66 3.5. Operatory porównania ............................................................................................ 70 3.6. Operatory logiczne ................................................................................................. 72 3.7. Kolejność wykonywania operacji .............................................................................. 73 3.8. Pętle..................................................................................................................... 74
  3. 3. 6 Perl 3.9. Sortowanie ............................................................................................................ 79 3.10. Pliki .................................................................................................................... 81 3.11. Zmienne wewnętrzne............................................................................................ 85 3.12. Funkcje przekształcające dane .............................................................................. 87 3.13. Uruchamianie programów zewnętrznych ................................................................. 92 3.14. Funkcja fork......................................................................................................... 95 3.15. Funkcja eval ........................................................................................................ 97 3.16. Podsumowanie .................................................................................................... 99 Rozdział 4. Procedury ...............................................................................................................................101 4.1. Informacje podstawowe ........................................................................................ 102 4.2. Wartości zwracane ............................................................................................... 102 4.3. Zmienne w procedurach ....................................................................................... 108 4.4. Argumenty procedur ............................................................................................. 112 4.5. Odwołania do procedur......................................................................................... 114 4.6. Bloki BEGIN i END................................................................................................ 116 4.7. Sygnały ............................................................................................................... 119 4.8. Podsumowanie .................................................................................................... 121 Rozdział 5. Wzorce tekstowe ..................................................................................................................123 5.1. Czym są wzorce tekstowe? ................................................................................... 124 5.2. Metaznaki ........................................................................................................... 126 5.3. Wyszukiwanie zakotwiczone .................................................................................. 129 5.4. Klasy znaków....................................................................................................... 130 5.5. Predefiniowane klasy znaków ................................................................................ 131 5.6. Nawiasy .............................................................................................................. 133 5.7. Pobieranie części łańcucha................................................................................... 133 5.8. Podstawianie....................................................................................................... 136 5.9. Zachłanność........................................................................................................ 137 5.10. Opcje dopasowywania i podstawiania .................................................................. 137 5.11. Funkcja study .................................................................................................... 141 5.12. Obiekty wzorców ................................................................................................ 141 5.13. Operator tr/// ................................................................................................... 142 5.14. Zastępowanie tekstów w wielu plikach................................................................. 144 5.15. Funkcja grep...................................................................................................... 144 5.16. Podsumowanie .................................................................................................. 145 Rozdział 6. Moduły ....................................................................................................................................147 6.1. Pakiety................................................................................................................ 147 6.2. Moduły................................................................................................................ 152 6.3. Eksportowanie symboli......................................................................................... 155 6.4. Kilka przykładowych modułów ............................................................................... 157 6.5. Dokumentowanie modułów przy użyciu formatu POD ............................................... 161 6.6. Podsumowanie .................................................................................................... 164 Rozdział 7. Obiekty....................................................................................................................................165 7.1. Obiekty ............................................................................................................... 166 7.2. Metody ............................................................................................................... 167 7.3. Dziedziczenie....................................................................................................... 170 7.4. Tworzenie obiektów i praca z nimi ......................................................................... 174 7.5. Podsumowanie .................................................................................................... 182
  4. 4. Spis treści 7 Rozdział 8. Wiązanie .................................................................................................................................183 8.1. Wiązanie ............................................................................................................. 184 8.2. Wiązanie skalarów ............................................................................................... 185 8.3. Wiązanie tablic asocjacyjnych ............................................................................... 189 8.4. Wiązanie tablic .................................................................................................... 198 8.5. Podsumowanie .................................................................................................... 201 Rozdział 9. Praca z plikami .....................................................................................................................203 9.1. Podstawy pracy z plikami ...................................................................................... 204 9.2. Sięganie do dowolnego miejsca w pliku ................................................................. 206 9.3. Uchwyty plików .................................................................................................... 208 9.4. Korzystanie ze znaków globalnych ......................................................................... 214 9.5. Identyfikatory rzeczywiste i identyfikatory efektywne ................................................ 215 9.6. Uprawnienia plikowe ............................................................................................ 217 9.7. Programy suid i sgid............................................................................................. 219 9.8. Testowanie plików za pomocą operatorów unarnych................................................ 220 9.9. Funkcja stat ........................................................................................................ 224 9.10. Blokowanie plików ............................................................................................. 225 9.11. Katalogi ............................................................................................................ 227 9.12. Zmienianie nazw oraz usuwanie plików i katalogów............................................... 230 9.13. Powiązania ........................................................................................................ 232 9.14. Podsumowanie .................................................................................................. 233 Rozdział 10. Programy sieciowe i komunikacja między procesami....................................................235 10.1. Potoki ............................................................................................................... 236 10.2. Komunikacja poprzez sieć................................................................................... 243 10.3. Współpraca z protokołami internetowymi ............................................................. 250 10.4. Podsumowanie .................................................................................................. 261 Rozdział 11. Relacyjne bazy danych ........................................................................................................263 11.1. Czym właściwie jest relacyjna baza danych?......................................................... 264 11.2. Wprowadzenie do języka SQL .............................................................................. 265 11.3. Zapytanie SELECT.............................................................................................. 269 11.4. Złączenia .......................................................................................................... 274 11.5. Aktualizowanie i usuwanie rekordów .................................................................... 274 11.6. Indeksy ............................................................................................................. 275 11.7. Perl i bazy danych .............................................................................................. 275 11.8. Proste programy korzystające z DBI ..................................................................... 279 11.9. Podsumowanie .................................................................................................. 282 Rozdział 12. Tworzenie aplikacji dla baz danych...................................................................................283 12.1. Projektowanie bazy danych ................................................................................. 283 12.2. Pisanie aplikacji................................................................................................. 290 12.3. Usuwanie błędów w programach korzystających z DBI ........................................... 303 12.4. Podsumowanie .................................................................................................. 306 Rozdział 13. Naprawianie programów i zagadnienia bezpieczeństwa................................................307 13.1. Identyfikowanie problemów ................................................................................. 308 13.2. Gdy pojawi się problem ...................................................................................... 312 13.3. Tryb analizy zagrożeń.......................................................................................... 314
  5. 5. 8 Perl 13.4. Wykrywanie i usuwanie błędów w kodzie .............................................................. 316 13.5. Szacowanie wydajności kodu .............................................................................. 323 13.6. Podsumowanie .................................................................................................. 326 Rozdział 14. Pisanie programów CGI ......................................................................................................327 14.1. Dynamiczne strony WWW.................................................................................... 327 14.2. Interfejs CGI ...................................................................................................... 332 14.3. Komunikaty o błędach i wykrywanie błędów w kodzie programów CGI ..................... 336 14.4. Przekierowanie do innej strony ............................................................................ 338 14.5. Inne metody modułu CGI .................................................................................... 341 14.6. Podsumowanie .................................................................................................. 342 Rozdział 15. Bardziej zło one programy CGI .........................................................................................343 15.1. Rejestracja użytkowników ................................................................................... 344 15.2. Cookies ............................................................................................................ 349 15.3. Tworzenie grafiki ................................................................................................ 354 15.4. Szablony ........................................................................................................... 358 15.5. Podsumowanie .................................................................................................. 361 Rozdział 16. Aplikacje WWW korzystające z baz danych .....................................................................363 16.1. Aktualizowanie kursów akcji................................................................................ 364 16.2. Kartki pocztowe ................................................................................................. 373 16.3. Personalizacja stron WWW z pomocą bazy danych ................................................ 378 16.4. Podsumowanie .................................................................................................. 388 Rozdział 17. mod_perl..............................................................................................................................389 17.1. Instalowanie i konfiguracja mod_perl ................................................................... 390 17.2. Dyrektywy konfiguracyjne .................................................................................... 392 17.3. Trzy proste moduły obsługujące........................................................................... 393 17.4. Moduł Apache::Registry ...................................................................................... 399 17.5. Przydatne moduły............................................................................................... 400 17.6. Podsumowanie .................................................................................................. 406 Rozdział 18. Mason...................................................................................................................................409 18.1. Pakiet Mason .................................................................................................... 409 18.2. Komponenty autohandler i dhandler .................................................................... 417 18.3. Komponent autohandler ..................................................................................... 417 18.4. Zarządzanie sesją użytkownika............................................................................ 419 18.5. Podsumowanie .................................................................................................. 426 Dodatek A Bibliografia .............................................................................................................................427 A.1. Książki poświęcone Perlowi .................................................................................. 427 A.2. Periodyki ............................................................................................................. 429 A.3. Książki o sieci WWW ............................................................................................ 429 A.4. Książki o bazach danych....................................................................................... 430 A.5. Użyteczne witryny WWW ........................................................................................ 431 Skorowidz ................................................................................................................................................433
  6. 6. Tworzenie aplikacji dla baz danych W tym rozdziale: n Projektowanie bazy danych n Tworzenie aplikacji dla baz danych n Wykrywanie błędów w programach &$+ Poprzedni rozdział był wprowadzeniem do zagadnień związanych z bazami danych, a w szcze- gólności do języka SQL i modułu &$+. W tym rozdziale wykorzystamy te narzędzia do przy- gotowania zestawu aplikacji obsługujących bazę danych. Po drodze przyjrzymy się projektowaniu bazy danych, co — podobnie jak w przypadku projektowania programu — jest kluczową, ale często niedocenianą częścią procesu pro- gramowania. W szczególności omówimy proces normalizacji, który poprawia efektywność bazy danych i czyni ją bardziej elastyczną, redukując jednocześnie mo liwość pojawienia się błędów. Aplikacje, które stworzymy, będą wykorzystywać zarówno techniki opisane w poprzednim rozdziale, jak i nowe typy danych SQL oraz metody interfejsu &$+. Przyjrzymy się bli ej metodzie VTCEG, która ułatwia wykrywanie błędów w zapytaniach SQL. Rozdział ten dostarcza podstawowej wiedzy na temat procesu pisania programów współ- działających z bazą danych, włączając w to projektowanie tabel i wykrywanie błędów w przy- gotowanych programach. 12.1. Projektowanie bazy danych Nasze zadanie polega na skomputeryzowaniu katalogu ksią ek sprzedawanych w pewnej księgarni. Zbudujemy bazę danych księgarni w systemie PostgreSQL i napiszemy w Perlu aplikacje, które pozwolą nam na obsługę danych zawartych w bazie.
  7. 7. 284 Perl Pierwszym krokiem podczas tworzenia aplikacji bazy danych jest zawsze stworzenie tabel. Opiszę tutaj proces tworzenia prostego projektu bazy danych, omawiając pokrótce proble- my pojawiające się w większości aplikacji baz danych. 12.1.1. Tabela Books Poniewa księgarni potrzebny jest katalog ksią ek oferowanych do sprzeda y, trzeba za- cząć od przygotowania tabeli $QQMU, której wiersze będą przechowywać dane o poszczegól- nych ksią kach (identyfikator ksią ki, kod ISBN, tytuł, autora, wydawcę, liczbę stron, datę wydania oraz cenę ksią ki): %4'#6' 6#$.' $QQMU DQQMAKF 5'4+#. 016 07.. KUDP 6':6 016 07.. VKVNG 6':6 016 07.. CWVJQT 6':6 016 07.. RWDNKUJGT 6':6 016 07.. PWOARCIGU 07/'4+% 016 07.. RWDAFCVG #6' 016 07.. WUAFQNNCTARTKEG 07/'4+% 016 07.. 24+/#4; -'; DQQMAKF 70+37' KUDP Nasza tabela $QQMU wygląda podobnie jak tabele, które prezentowałem w rozdziale 11., niemniej pojawia się parę typów danych oraz ograniczeń, których jeszcze nie omawialiśmy: n kolumna daty wydania RWDAFCVG jest typu #6' (data). Jest to typ bardzo podobny do typu 6+/'56#/2 (znacznik czasu), ale zawiera samą datę, bez informacji o godzinie; n kolumna ceny WUAFQNNCTARTKEG została zdefiniowana jako kolumna typu 07/'4+% , co oznacza, e mo e zawierać sześciocyfrowe liczby posiadające dwie cyfry po przecinku. Tak więc mo emy sprzedawać ksią ki o cenie do 9999,99 dolarów; n kolumna KUDP przechowuje niepowtarzalny i niezmienny kod ISBN (ang. International Standard Book Number), który mógłby pełnić funkcję klucza głównego. Niemniej kody ISBN są dość długie, a zazwyczaj dobrze jest, aby klucz główny był tak krótki, jak to tylko mo liwe. Aby upewnić się, e wartości w kolumnie KUDP będą niepowtarzalne (choć nie są one kluczem głównym), mo emy dodać do definicji tabeli ograniczenie 70+37', które automatycznie utworzy indeks dla podanej kolumny. Z technicznego punktu widzenia zaprezentowana tutaj definicja tabeli $QQMU jest w pełni poprawna. Niemniej w momencie, gdy zaczniemy korzystać z tej tabeli, ujawnią się pewne istotne problemy.
  8. 8. Rozdział 12. n Tworzenie aplikacji dla baz danych 285 Załó my, e księgarnia chciałaby przygotować katalog ksią ek wydawnictwa Prentice-Hall. Przedstawione tu zapytanie powinno pobrać nazwy wszystkich ksią ek wydanych przez Prentice-Hall: 5'.'%6 VKVNG (41/ $QQMU 9*'4' RWDNKUJGT 2TGPVKEG*CNN 14'4 $; VKVNG Co się jednak stanie, jeśli jedna z ksią ek będzie miała w kolumnie RWDNKUJGT wydawcę podanego jako 2TGPVKEG *CNN zamiast 2TGPVKEG*CNN? Taka ksią ka oczywiście nie będzie spełniać wymogów stawianych przez nasze zapytanie i w związku z tym nie trafi do katalogu. Podobne problemy pojawiają się równie podczas wyszukiwania ksią ek napisanych przez określonego autora. Jeśli osoba wpisująca ksią kę do bazy przez pomyłkę źle wpisze na- zwisko autora, to ksią ka ta nie pojawi się w odpowiedzi na zapytanie 5'.'%6 pobierające autora (CWVJQT) o określonym nazwisku. 12.3.2. Normalizacja tabeli Books Rozwiązaniem tego problemu jest normalizacja danych, która pozwala upewnić się, e dane wpisywane będą do bazy w jeden tylko sposób. Znormalizowane bazy danych cechuje znacz- nie mniejsze ryzyko pojawienia się uszkodzonych lub niezsynchronizowanych danych. Bazy takie są równie znacznie wydajniejsze ni bazy, które nie zostały znormalizowane. Aby znormalizować tabelę $QQMU, przygotujemy dwie nowe tabele: 2WDNKUJGTU (wydawcy) i #WVJQTU (autorzy). Tabele te będą pozwalały na wpisanie ka dego autora i ka dego wy- dawcy do bazy danych tylko raz. Dodatkowo wykorzystamy mechanizm kluczy obcych wskazujących na te wartości (patrz: sekcja 11.3.6): %4'#6' 6#$.' #WVJQTU CWVJQTAKF 5'4+#. 016 07.. CWVJQTAPCOG 6':6 016 07.. 24+/#4; -'; CWVJQTAKF %4'#6' 6#$.' 2WDNKUJGTU RWDNKUJGTAKF 5'4+#. 016 07.. RWDNKUJGTAPCOG 6':6 016 07.. 24+/#4; -'; RWDNKUJGTAKF 70+37' RWDNKUJGTAPCOG %4'#6' 6#$.' $QQMU DQQMAKF 5'4+#. 016 07..
  9. 9. 286 Perl KUDP 6':6 016 07.. VKVNG 6':6 016 07.. CWVJQTAKF +06')'4 016 07.. 4'('4'0%'5 #WVJQTU RWDNKUJGTAKF +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU PWOARCIGU 07/'4+% 016 07.. RWDAFCVG #6' 016 07.. WUAFQNNCTARTKEG 07/'4+% 016 07.. 24+/#4; -'; DQQMAKF 70+37' KUDP Warto zauwa yć, e tabele te nakładają ograniczenie unikatowości na nazwę wydawnictwa, ale nie nakładają go na nazwiska autorów. Mo e się w końcu zdarzyć kilku autorów o na- zwisku John Smith, ale raczej nie powinno istnieć więcej ni jedno wydawnictwo o nazwie Prentice Hall. Znormalizowane tabele gwarantują, e nazwiska autorów i nazwy wydawnictw będą wy- stępowały w tej samej formie w całej bazie danych. Co więcej, zmiana nazwy wydawnic- twa wymagać będzie teraz aktualizacji tylko jednego wiersza w tabeli 2WDNKUJGTU zamiast wielu wierszy w tabeli $QQMU. Jakby tych korzyści było jeszcze mało, tabela $QQMU zmniej- szy znacznie swoje rozmiary dzięki zastąpieniu dwóch kolumn typu 6':6 kolumnami typu +06')'4. Znormalizowane tabele zajmować będą mniej miejsca na dysku i w pamięci, co przyspieszy działanie bazy danych. Obecnie nasze zapytanie pobierające ksią ki wydawnictwa Prentice-Hall wymaga wykona- nia złączenia: 5'.'%6 VKVNG (41/ $QQMU $ 2WDNKUJGTU 2 9*'4' 2RWDNKUJGTAPCOG 2TGPVKEG*CNN #0 2RWDNKUJGTAKF $RWDNKUJGTAKF 14'4 $; VKVNG Złączenie razem trzech tablic pozwoli na zdobycie listy wszystkich ksią ek napisanych przez określonego autora, takiego jak np. Paul Krugman: 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $RWDAFCVG $WUAFQNNCTARTKEG (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # 9*'4' #CWVJQTAPCOG 2CWN -TWIOCP #0 $CWVJQTAKF #CWVJQTAKF #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF 14'4 $; VKVNG 12.1.3. Głębsza normalizacja Przedstawiona przed chwilą wersja tabeli $QQMU była niewątpliwie krokiem w dobrym kie- runku. Co jednak, jeśli dana ksią ka ma więcej ni jednego autora? Dotychczasowa defini- cja tabeli nie dopuszcza takiej sytuacji.
  10. 10. Rozdział 12. n Tworzenie aplikacji dla baz danych 287 Jednym z mo liwych rozwiązań tego problemu jest dodanie do tabeli $QQMU kilku nowych kolumn. Mo na na przykład zmienić kolumnę CWVJQTAKF na CWVJQTAKF i dodać trzy ko- lumny dopuszczające wartość 07.. (CWVJQTAKF, CWVJQTAKF oraz CWVJQTAKF) przeznaczone dla dodatkowych autorów. To rozwiązanie jednak sztucznie ogranicza liczbę autorów, których mo e posiadać ksią ka, i prowadzi do niepotrzebnego marnotrawienia przestrzeni na dysku w przypadku ka dej ksią ki, która będzie miała mniej autorów. Dodatkowo nadmiernie komplikuje wszystkie za- pytania — rozwa my na przykład listę ksią ek napisanych przez Paula Krugmana: 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $RWDAFCVG $WUAFQNNCTARTKEG (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # 9*'4' #CWVJQTAPCOG 2CWN -TWIOCP #0 $CWVJQTAKF #CWVJQTAKF 14 $CWVJQTAKF #CWVJQTAKF 14 $CWVJQTAKF #CWVJQTAKF 14 $CWVJQTAKF #CWVJQTAKF #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF 14'4 $; VKVNG Lepszym rozwiązaniem jest zupełne usunięcie informacji o autorze z tabeli $QQMU. Zamiast tego przygotujemy tabelę $QQM#WVJQTU (autorzy ksią ki) posiadającą dwie kolumny — jedną będzie klucz obcy do tabeli $QQMU, a drugą klucz obcy do tabeli #WVJQTU. A oto poprawiona definicja tabeli $QQMU wraz z tabelą $QQM#WVJQTU: %4'#6' 6#$.' $QQMU DQQMAKF 5'4+#. 016 07.. KUDP 6':6 016 07.. VKVNG 6':6 016 07.. RWDNKUJGTAKF +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU PWOARCIGU 07/'4+% 016 07.. RWDAFCVG #6' 016 07.. WUAFQNNCTARTKEG 07/'4+% 016 07.. 24+/#4; -'; DQQMAKF 70+37' KUDP %4'#6' 6#$.' $QQM#WVJQTU DQQMAKF +06')'4 016 07.. 4'('4'0%'5 $QQMU CWVJQTAKF +06')'4 016 07.. 4'('4'0%'5 #WVJQTU 70+37' DQQMAKF CWVJQTAKF Zarówno identyfikator ksią ki (DQQMAKF), jak i identyfikator autora (CWVJQTAKF) mogą pojawić się w tabeli wielokrotnie. Powinniśmy jednak zagwarantować, eby ka dy autor w odniesie- niu do konkretnej ksią ki pojawiał się tylko raz. Robimy to, stosując ograniczenie 70+37' łącznie na dwóch kolumnach zamiast na pojedynczej kolumnie.
  11. 11. 288 Perl Po dodaniu tabeli $QQM#WVJQTU zapytanie odszukujące wszystkie ksią ki napisane przez Paula Krugmana wymagać będzie wykonania złączenia czterech tabel: 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $RWDAFCVG $WUAFQNNCTARTKEG (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $# 9*'4' #CWVJQTAPCOG 2CWN -TWIOCP #0 #CWVJQTAKF $#CWVJQTAKF #0 $#DQQMAKF $DQQMAKF #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF 14'4 $; VKVNG Z kolei następne zapytanie zwraca ksią kę o numerze ISBN , zwracając jeden wiersz dla ka dego autora ksią ki: 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $RWDAFCVG $WUAFQNNCTARTKEG (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $# 9*'4' $KUDP #0 $DQQMAKF $#DQQMAKF #0 $#CWVJQTAKF #CWVJQTAKF #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF 14'4 $; VKVNG Jak widać, prawidłowo zaprojektowana baza danych pozwala na uzyskanie odpowiedzi na wiele ró nych pytań — nawet jeśli nie uwzględnialiśmy ich podczas projektowania bazy. 12.1.4. Indeksy Jak pisałem w podrozdziale 11.6, nale y dodawać indeks do ka dej kolumny, która mo e pojawiać się w klauzuli 9*'4'. Klucze główne i kolumny oznaczone jako 70+37' są indek- sowane automatycznie, co oszczędza nam trochę pracy. W naszych tabelach jest jednak jeszcze kilka kolumn, na których prawdopodobnie równie wykonywane będą zapytania. %4'#6' +0': CWVJQTAPCOGAKPFGZ 10 #WVJQTU CWVJQTAPCOG %4'#6' +0': RWDNKUJGTAPCOGAKPFGZ 10 2WDNKUJGTU RWDNKUJGTAPCOG %4'#6' +0': DQQMAVKVNGAKPFGZ 10 $QQMU VKVNG %4'#6' +0': DQQMARWDNKUJGTAKFAKPFGZ 10 $QQMU RWDNKUJGTAKF %4'#6' +0': DQQMARWDFCVGAKPFGZ 10 $QQMU RWDAFCVG %4'#6' +0': DQQMAWUAFQNNCTARTKEGAKPFGZ 10 $QQMU WUAFQNNCTARTKEG %4'#6' +0': CWVJQTAKFAKPFGZ 10 $QQM#WVJQTU CWVJQTAKF Przygotowanie tych indeksów sprawi, e nawet jeśli księgarnia oferować będzie kilka mi- lionów ksią ek, łatwo i szybko je odnajdziemy, poszukując ksią ek według tytułu, autora, daty publikacji czy ceny.
  12. 12. Rozdział 12. n Tworzenie aplikacji dla baz danych 289 12.1.5. Integralność powiązań Nasze obecne definicje tabel zabraniają wstawiania wartości 07.. do kolumn tytułów ksią- ek i kodów ISBN. Mo e się jednak zdarzyć, e przez przypadek do tej lub innej kolumny wstawimy pusty łańcuch. Poniewa tworzona baza danych jest centralnym miejscem zbierania informacji o ksią kach dostępnych w księgarni, przechowywane w niej dane muszą być na tyle wiarygodne, na ile to tylko mo liwe. Słowo kluczowe %*'%- bazy PostgreSQL pozwala na nało enie na ko- lumny dodatkowych ograniczeń, w wyniku których wprowadzane dane przechodzić będą dodatkowe testy. Na przykład tabelę $QQMU mo na przedefiniować w następujący sposób: %4'#6' 6#$.' $QQMU DQQMAKF 5'4+#. 016 07.. KUDP 6':6 016 07.. %*'%- KUDP VKVNG 6':6 016 07.. %*'%- VKVNG `
  13. 13. =#? RWDNKUJGTAKF +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU PWOARCIGU 07/'4+% 016 07.. %*'%- PWOARCIGU RWDAFCVG #6' 016 07.. WUAFQNNCTARTKEG 07/'4+% 016 07.. %*'%- WUAFQNNCTARTKEG 24+/#4; -'; DQQMAKF 70+37' KUDP Taka poprawiona definicja tabeli $QQMU uniemo liwia wpisanie do kolumny KUDP pustego łańcucha, gwarantuje, e kolumna VKVNG zawierać będzie przynajmniej jedną literę lub cyfrę (korzystając w tym celu z niewra liwego na rozmiar liter operatora `
  14. 14. PostgreSQL), i wy- maga, eby wartości w kolumnach PWOARCIGU i WUAFQNNCTARTKEG były liczbami dodatnimi. PostgreSQL będzie od tej pory odmawiać dodawania do bazy ksią ek, które łamać będą jedno lub więcej z tak zdefiniowanych ograniczeń. Jeśli na przykład spróbujemy dodać ksią - kę nieposiadającą tytułu: +05'46 +061 $QQMU KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 GE — PostgreSQL zwróci następujący komunikat o błędzie: '4414 'ZGE#RRGPF TGLGEV FWG VQ %*'%- EQPUVTCKPV DQQMUAVKVNG Tego rodzaju ograniczenia mogą się wydawać nonsensowne lub zbyteczne, niemniej wcale tak nie jest. Bez nich moglibyśmy przypadkowo wprowadzić do bazy danych nieprawidłowe dane. Naprawianie bazy danych zawierającej niepoprawne lub niespójne dane jest skompli- kowanym i pracochłonnym zadaniem, szczególnie jeśli baza danych musi być cały czas do- stępna. Ograniczenie %*'%- pozwala na uniknięcie takich sytuacji, wymuszając poprawność informacji zapisywanych w bazie danych.
  15. 15. 290 Perl 12.1.6. Kategorie ksią ek Chcielibyśmy tak e przypisać ka dą ksią kę do jednej lub więcej kategorii. Najprostszy sposób polega na przygotowaniu pary tabel podobnych do tych, które przygotowaliśmy dla autorów — tabeli %CVGIQTKGU z nazwami kategorii i tabeli %CVGIQT[$QQMU, która powią e te kategorie z ksią kami: %4'#6' 6#$.' %CVGIQTKGU ECVGIQT[AKF 5'4+#. 016 07.. ECVGIQT[APCOG 6':6 016 07.. 24+/#4; -'; ECVGIQT[AKF 70+37' ECVGIQT[APCOG %4'#6' 6#$.' $QQM%CVGIQTKGU DQQMAKF +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU ECVGIQT[AKF +06')'4 016 07.. 4'('4'0%'5 %CVGIQTKGU 70+37' DQQMAKF ECVGIQT[AKF %4'#6' +0': ECVGIQT[AKFAKPFGZ 10 $QQM%CVGIQTKGU ECVGIQT[AKF 12.2. Pisanie aplikacji Gdy baza danych jest gotowa, mo na przygotować programy Perla, które będą z nią współ- pracować. Jeden zestaw programów pozwoli personelowi księgarni wprowadzać, aktuali- zować i usuwać informacje na temat ksią ek, autorów i wydawców. Drugi przeznaczony będzie dla klientów księgarni, eby z jego pomocą mogli odnaleźć w bazie danych intere- sujące ich ksią ki. 12.2.1. Wprowadzanie informacji o autorach Kusić nas mo e, aby zacząć od przygotowania aplikacji pozwalającej na wprowadzanie do bazy danych informacji o ksią kach. Jednak musimy pamiętać, e kolumna RWDNKUJGTAKF w tabeli $QQMU jest kluczem obcym tabeli 2WDNKUJGTU, co oznacza, ze przed zapełnieniem tabeli $QQMU trzeba najpierw wypełnić tabelę 2WDNKUJGTU. Pierwszy z przedstawionych programów, insert-author.pl, łączy się z serwerem Postgre- SQL, pobiera od u ytkownika nazwisko autora ksią ki i wykonuje odpowiednie zapytanie +05'46 wstawiające autora do bazy. Jeśli coś pójdzie nie tak, zakończy pracę, sygnalizując krytyczny błąd.
  16. 16. Rozdział 12. n Tworzenie aplikacji dla baz danych 291 Program ten wykonuje prosty test integralności danych na poziomie aplikacji, aby upewnić się, e nazwisko autora zawiera przynajmniej jeden znak. Większość aplikacji współpracu- jących z bazami danych sprawdza wprowadzane dane dwukrotnie: na poziomie definicji ta- beli (ograniczenie %*'%-) i ponownie na poziomie aplikacji. Pierwszy test sprawdza, czy baza danych nie zawiera niespójnych lub uszkodzonych danych, a drugi pozwala na przechwy- tywanie błędów i przygotowywanie czytelnych komunikatów o błędach dla u ytkownika. WUTDKPRGTN PCYC RNKMW KPUGTVCWVJQTRN WUG UVTKEV WUG YCTPKPIU WUG $+ 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 2TKPV'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT 2QDKGT QF W [VMQYPKMC PCYKUMQ PQYGIQ CWVQTC RTKPV 2QFCL PCYKUMQ CWVQTC O[ CWVJQTAPCOG EJQOR CWVJQTAPCOG 0CYKUMQ CWVQTC OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM KH CWVJQTAPCOG ` Y ] RTKPV 0CYKUMQ CWVQTC OWUK CYKGTCè RTKPV EQ PCLOPKGL LGFGP PCM -Q Eú RTCEúP _ ,G NK PCYKUMQ CWVQTC LGUV 1- YUVCY LG GNUG ] 7UW PKGRQVTGDPG URCELG PCYKUMC CWVQTC CWVJQTAPCOG ` U@U I CWVJQTAPCOG ` UU I 2T[IQVWL CR[VCPKG O[ USN +05'46 +061 #WVJQTU CWVJQTAPCOG 8#.7'5 ! O[ UWEEGUU FDJ FQ USN WPFGH CWVJQTAPCOG KH UWEEGUU ] RTKPV 9UVCYK GO FQ DC[ CWVQTC CWVJQTAPCOG P _ GNUG ] FKG $ æF Y[YQ CPKC CR[VCPKC 53. USN $+GTTUVT _ _ COMPKL RQ æEGPKG DCæ FCP[EJ FDJ FKUEQPPGEV
  17. 17. 292 Perl Warto przyjrzeć się odwołaniu do metody FDJ FQ w programie insert-author.pl. Metoda FQ interfejsu $+ przeznaczona jest dla tych zapytań +05'46 i 72#6', które nie muszą pobie- rać wyników zapytania za pośrednictwem uchwytu UVJ. Pierwszy argument metody FDJ FQ jest łańcuchem zawierającym instrukcję SQL, a drugi odwołaniem do tablicy asocja- cyjnej zawierającej definicje atrybutów (lub wartość WPFGH). Pozostałe argumenty są warto- ściami, jakie interfejs $+ powinien przypisać symbolom zastępczym w instrukcji SQL. Metoda FDJ FQ zwraca liczbę zmienionych przez nią wierszy w tabeli. 12.2.2. Wprowadzanie kategorii Program insert-category.pl wstawiający nową kategorię do tabeli %CVGIQTKGU jest bardzo podobny do programu insert-author.pl. Niemniej tym razem istnieje pewna pułapka: ko- lumna ECVGIQT[APCOG została zdefiniowana jako 70+37'. Nasza aplikacja mogłaby ignoro- wać ten wymóg, próbując na ślepo wstawiać nowe nazwy kategorii do tabeli %CVGIQTKGU. Gdyby baza PostgreSQL odmówiła dodania nowej kategorii, moglibyśmy przechwycić błąd i zaraportować go u ytkownikowi. Tutaj jednak zastosowaliśmy bardziej wyszukane rozwiązanie, które wymaga sprawdzenia bazy danych w celu ustalenia, czy taka nazwa kategorii nie została ju wcześniej wprowa- dzona. To jednak pociąga za sobą konieczność wykonania zapytania 5'.'%6 (aby pobrać nazwy ju istniejących kategorii), a dopiero potem zapytania +05'46 (aby wstawić nową kate- gorię). Co jednak, jeśli ktoś inny spróbuje wykonać między tymi dwoma zapytaniami po- dobne zapytanie +05'46? Rozwiązanie, tak jak to zostało wspomniane w sekcji 11.7.4 w poprzednim rozdziale, pole- ga na połączeniu zapytań 5'.'%6 i +05'46 w pojedynczej transakcji. W ten sposób upew- niamy się, e nikt inny nie zmodyfikuje bazy danych między obydwoma naszymi zapyta- niami. Obsługę transakcji mo na włączyć, przypisując atrybutowi #WVQ%QOOKV wartość (#.5'. Wygodniej jest jednak skorzystać z metody FDJ DGIKPAYQTM , która wyłączy atrybut #W VQ%QOOKV na czas pojedynczej transakcji — do momentu wywołania metody FDJ EQOOKV zatwierdzającej transakcję lub metody FDJ TQNNDCEM wycofującej transakcję. Kod programu będzie więc najpierw pytał u ytkownika o nazwę nowej kategorii, następnie za pomocą zapytania 5'.'%6 sprawdzi, czy takiej nazwy ju nie ma, a jeśli taka kategoria ju istnieje — przerwie wykonywanie transakcji, przywołując metodę FDJ TQNNDCEM . Wy- cofanie transakcji nie jest w tym przypadku tak naprawdę konieczne, poniewa nie zmody- fikowaliśmy adnej tabeli. Ja jednak zawsze staram się postępować przezornie i przerywam zapytanie za pomocą metody FDJ TQNNDCEM . Gdy ju dane przejdą wszystkie testy na poziomie aplikacji, wykonywane jest zapytanie +05'46 i wywoływana metoda FDJ EQOOKV zatwierdzająca transakcję. Warto zauwa yć, e program insert-category.pl działa z włączonym atrybutem 4CKUG'TTQT. Oznacza to, e nie ma potrzeby sprawdzania wartości zwracanych przez procedury RTGRCTG i GZGEWVG, poniewa program zakończy działanie, sygnalizując krytyczny błąd, za ka dym razem, gdy natknie się na błąd bazy danych. WUTDKPRGTN PCYC RNKMW KPUGTVECVGIQT[RN
  18. 18. Rozdział 12. n Tworzenie aplikacji dla baz danych 293 WUG UVTKEV WUG YCTPKPIU WUG $+ 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 4CKUG'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT 2QDKGT QF W [VMQYPKMC PCYú PQYGL MCVGIQTKK RTKPV 2QFCL PCYú PQYGL MCVGIQTKK O[ ECVGIQT[APCOG EJQOR ECVGIQT[APCOG 0CYC MCVGIQTKK OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM KH ECVGIQT[APCOG ` Y ] RTKPV 0CYC MCVGIQTKK OWUK CYKGTCè RTKPV EQ PCLOPKGL LGFGP PCM 'ZKVKPIP _ ,G NK PCYC MCVGIQTKK LGUV 1- URTÎDWL Læ YUVCYKè GNUG ] 7UW PKGRQVTGDPG URCELG ECVGIQT[APCOG ` U@U I ECVGIQT[APCOG ` UU I 9[ æE #WVQ%QOOKV PC ECU LGFPGL VTCPUCMELK 2QQUVCPKG QP Y[ æEQP[ FQ ECUW Y[YQ CPKC OGVQF[ FDJ EQOOKV NWD FDJ TQNNDCEM FDJ DGIKPAYQTM %[ VCMC PCYC MCVGIQTKK LW LGUV Y DCKG FCP[EJ! ,G NK VCM Y[EQHCL VTCPUCMELú RQKPHQTOWL W [VMQYPKMC Q RTQDNGOKG K CMQ E RTCEú 7VYÎT CR[VCPKG O[ UGNGEVAUSN 5'.'%6 %1706 ECVGIQT[AKF UGNGEVAUSN (41/ %CVGIQTKGU YJGTG ECVGIQT[APCOG ! 2T[IQVWL KPUVTWMELú O[ UVJ FDJ RTGRCTG UGNGEVAUSN 9[MQPCL KPUVTWMELú UVJ GZGEWVG ECVGIQT[APCOG 2QDKGT Y[PKM O[ ECVGIQT[ACNTGCF[AGZKUVU UVJ HGVEJTQYACTTC[ CMQ E VQ CR[VCPKG UVJ HKPKUJ KH ECVGIQT[ACNTGCF[AGZKUVU
  19. 19. 294 Perl ] RTKPV -CVGIQTKC ECVGIQT[APCOG D[ C LW RTKPV FQFCPC FQ DC[P5RTÎDWL YRKUCè KPPæ PCYúP 6TCPUCMELC Y[EQHCPC FDJ TQNNDCEM _ GNUG ] 2T[IQVWL CR[VCPKG +05'46 O[ USN +05'46 +061 %CVGIQTKGU ECVGIQT[APCOG 8#.7'5 ! 2T[IQVWL KPUVTWMELú O[ UWEEGUUHWNN[AKPUGTVGF FDJ FQ USN WPFGH ECVGIQT[APCOG KH UWEEGUUHWNN[AKPUGTVGF ] RTKPV QFC GO FQ DC[ MCVGIQTKú ECVGIQT[APCOG P FDJ EQOOKV _ GNUG ] RTKPV $ æF YUVCYKCPKC $+GTTUVT P FDJ TQNNDCEM _ _ _ CMQ E RQ æEGPKG DCæ FCP[EJ FDJ FKUEQPPGEV Jak łatwo przewidzieć, program insert-publisher.pl będzie wyglądał bardzo podobnie do programu insert-category.pl. 12.2.3. Modyfikowanie ju istniejących wartości Program insert-category.pl działa całkiem sprawnie — co jednak, jeśli ktoś wprowadzi do bazy złą nazwę kategorii? Baza danych księgarni potrzebuje jakiegoś sposobu modyfiko- wania ju istniejących nazw kategorii (to samo dotyczy wstawionych nazw autorów i wy- dawców, ale tutaj omawiać będziemy tylko przypadek kategorii). Program update-category.pl będzie wymagał podania przez u ytkownika dwóch wartości: starej nazwy kategorii QNFAECVGIQT[APCOG i nowej kategorii PGYAECVGIQT[APCOG. Mo e się jednak zdarzyć, e u ytkownik popełni błąd przy wpisywaniu starej nazwy kategorii, po- dając nazwę, której nie ma w bazie danych, i wówczas klauzula 9*'4' zapytania SQL nie będzie pasowała do adnego wiersza tabeli %CVGIQTKGU. Moduł 6GTO%QORNGVG dostępny w sieci %2#0 (patrz: podrozdział 1.6) pozwala na ograni- czenie liczby przyjmowanych od u ytkownika danych wejściowych. Moduł 6GTO%QORNGVG automatycznie eksportuje do przestrzeni nazw kodu przywołującego procedurę %QORNGVG.
  20. 20. Rozdział 12. n Tworzenie aplikacji dla baz danych 295 Procedura %QORNGVG wymaga przesłania jej dwóch argumentów. Pierwszy z nich to tekst komunikatu proszącego o wprowadzenie danych, który zostanie wyświetlony u ytkowni- kowi, a drugi jest listą lub te odwołaniem do tablicy, które zawierać będą dopuszczalne odpowiedzi u ytkownika. U ytkownik mo e w ka dej chwili wcisnąć klawisze CTL+D, by wyświetlić listę dopuszczalnych odpowiedzi. Jeśli u ytkownik wprowadzi wystarczającą liczbę znaków, aby było mo liwe jednoznaczne zidentyfikowanie danego elementu listy, wciśnięcie klawisza TAB pozwoli uzupełnić resztę. Program update-category.pl pobierze listę bie ących kategorii (która przesłana zostanie procedurze %QORNGVG), korzystając z zapytania 5'.'%6, a następnie będzie modyfikować bazę za pomocą zapytania 72#6'. Oba zapytania zostaną połączone w jedną transakcję za po- mocą metody FDJ DGIKPAYQTM, podobnie jak to było w programie insert-category.pl. Lista kategorii pobierana jest z tabeli %CVGIQTKGU. Zamiast jednak umieszczać nazwy kate- gorii w tablicy, uczynimy je kluczami tablicy asocjacyjnej ECVGIQTKGU. Sprawdzenie, czy dany klucz istnieje w tablicy asocjacyjnej, zajmuje bowiem znacznie mniej czasu ni od- szukanie elementu w tablicy, tak więc program będzie dzięki temu działał szybciej. A oto jedna z mo liwych implementacji programu update-category.pl: WUTDKPRGTN PCYC RNKMW WRFCVGECVGIQT[RN WUG UVTKEV WUG YCTPKPIU WUG $+ WUG 6GTO%QORNGVG 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 4CKUG'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT O[ ECVGIQTKGU 4QRQEPKL VTCPUCMELú MVÎTC DúFKG VTYC C FQ ECUW Y[YQ CPKC OGVQF[ FDJ EQOOKV NWD FDJ TQNNDCEM FDJ DGIKPAYQTM 2QDKGT PCY[ MCVGIQTKK K WE[ LG MNWECOK ECVGIQTKGU O[ USN 5'.'%6 ECVGIQT[APCOG HTQO %CVGIQTKGU O[ UVJ FDJ RTGRCTG USN UVJ GZGEWVG YJKNG O[ TQYTGH UVJ HGVEJTQYACTTC[TGH ] QFCL PQY[ MNWE FQ ECVGIQTKGU YCTVQ EKæ ECVGIQTKGU] TQYTGH=?_ _ CMQ E KPUVTWMELú UVJ HKPKUJ
  21. 21. 296 Perl O[ QNFAECVGIQT[APCOG 2QDKGT KUVPKGLæEæ MCVGIQTKú W [YCLæE 6GTO%QORNGVG )F[ RTGTYKGO[ Vú RúVNú OKGPPC QNFAECVGIQT[APCOG DúFKG CYKGTCè PCYú KUVPKGLæEGL MCVGIQTKK WPVKN FGHKPGF ECVGIQTKGU] QNFAECVGIQT[APCOG_ ] QNFAECVGIQT[APCOG %QORNGVG 9RTQYCF PCYú KUVPKGLæEGL MCVGIQTKK MG[U ECVGIQTKGU _ 2QDKGT PQYæ PCYú MCVGIQTKK RTKPV OKG QNFAECVGIQT[APCOG PC O[ PGYAECVGIQT[APCOG EJQOR PGYAECVGIQT[APCOG 0CYC MCVGIQTKK OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM KH PGYAECVGIQT[APCOG ` Y ] RTKPV $ æF 0CYC MCVGIQTKK OWUK CYKGTCè EQ PCLOPKGL LGFGP PCM P _ ,G NK PCY[ MCVGIQTKK Uæ 1- URTCYF E[ PKG OC LW LGL Y DCKG FCP[EJ GNUG ] 7UW PCY[ PKGRQVTGDPG URCELG PGYAECVGIQT[APCOG ` U@U I PGYAECVGIQT[APCOG ` UU I ,G NK PGYAECVGIQT[APCOG LGUV Y VCDGNK ECVGIQTKGU OWUKO[ RTGTYCè CD[ PCY[ UKú PKG RQYVCTC [ KH FGHKPGF ECVGIQTKGU] PGYAECVGIQT[APCOG_ ] CU[IPCNKWL D æF W [VMQYPKMQYK K Y[EQHCL VTCPUCMELú RTKPV $ æF -CVGIQTKC PGYAECVGIQT[APCOG LW KUVPKGLG Y DCKG FCP[EJ P FDJ TQNNDCEM FDJ FKUEQPPGEV GZKV _ 7VYÎT CR[VCPKG O[ USN 72#6' %CVGIQTKGU USN 5'6 ECVGIQT[APCOG ! USN 9*'4' ECVGIQT[APCOG ! 2T[IQVWL KPUVTWMELú O[ PWODGTAQHACHHGEVGFATQYU FDJ FQ USN WPFGH PGYAECVGIQT[APCOG QNFAECVGIQT[APCOG KH PWODGTAQHACHHGEVGFATQYU ] 4CRQTVWL Y[PKM W [VMQYPKMQYK K CVYKGTF VTCPUCMELú RTKPV OKGPK GO PCYú QNFAECVGIQT[APCOG PC PGYAECVGIQT[APCOG P FDJ EQOOKV _
  22. 22. Rozdział 12. n Tworzenie aplikacji dla baz danych 297 GNUG ] 4CRQTVWL D æF W [VMQYPKMQYK K Y[EQHCL VTCPUCMELú RTKPV OKCPC PCY[ PKG QUVC C Y[MQPCPCP FDJ TQNNDCEM _ _ CMQ E RQ æEGPKG DCæ FCP[EJ FDJ FKUEQPPGEV 12.2.4. Dodawanie nowych ksią ek Po dodaniu kilku pozycji do tabel #WVJQTU, 2WDNKUJGTU i %CVGIQTKGU mo na przystąpić do wprowadzania do bazy danych księgarni nowych ksią ek. Dodanie nowej ksią ki oznacza konieczność wstawienia jednego wiersza do tabeli $QQMU i jednego lub więcej wierszy do tabeli $QQM#WVJQTU. Kolejny program, insert-book.pl, wykorzystuje większość technik, które opisywałem wcze- śniej w tym rozdziale: wykonuje zapytanie pobierające z bazy danych listę ju wprowadzo- nych wydawców i autorów, wykorzystuje moduł 6GTO%QORNGVG, dzięki któremu u ytkownik podaje odpowiednią nazwę wydawnictwa i nazwisko autora, i wreszcie wstawia wiersze do tabel $QQMU i $QQM#WVJQTU. Co więcej, przeprowadza to wszystko w ramach jednej transak- cji, dzięki czemu opisana sekwencja transakcji zostaje wykonana łącznie i niepowodzenie jednej oznaczać będzie niepowodzenie wszystkich. Warto równie zauwa yć, e korzystamy tutaj z właściwego tylko bazie PostgreSQL atry- butu RIAQKFAUVCVWU, który zwraca identyfikator (OID) ostatnio wstawionego obiektu. Identyfikatory obiektów są elementem specyficznym dla PostgreSQL. Mo na postrzegać je jako niewidoczny, globalny klucz główny ka dego wiersza w bazie danych. Identyfikator OID ostatnio wprowadzonego wiersza pozwala na pobranie klucza głównego dla ostatnio wykonanej operacji +05'46. Na koniec warto przyjrzeć się, w jaki sposób wiersze wstawiane są do tabeli $QQM#WVJQTU za pomocą pojedynczego odwołania do metody RTGRCTG i kilkakrotnego przywoływania metody GZGEWVG. W ten sposób odcią amy program Perla i przyśpieszamy znacznie wyko- nywanie zapytania, jeśli baza, z której korzystamy, przechowuje zapytania w pamięci pod- ręcznej. Program insert-book.pl jest jak dotąd najdłu szym programem związanym z bazami da- nych, które były omawiane w tej ksią ce. Poniewa jednak wszystkie jego elementy poja- wiały się ju w poprzednio prezentowanych programach, zrozumienie go nie powinno być zbyt trudne. WUTDKPRGTN PCYC RNKMW KPUGTVDQQMRN WUG UVTKEV WUG YCTPKPIU WUG $+
  23. 23. 298 Perl WUG 6GTO%QORNGVG RTKPV 9KVCO[ Y RTQITCOKG 9UVCY MUKæ Mú PP 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 4CKUG'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT FGHKPKWL RCTú EúUVQ W [YCP[EJ OKGPP[EJ O[ USN UVJ CEPKL PQYæ VTCPUCMELú MVÎTæ CMQ E[ Y[YQ CPKG FDJ EQOOKV NWD FDJ TQNNDCEM FDJ DGIKPAYQTM 2QDKGT CWVQTÎY K WE[ KEJ MNWECOK VCDNKE[ CUQELCE[LPGL O[ CWVJQTU USN 5'.'%6 CWVJQTAPCOG CWVJQTAKF USN (41/ #WVJQTU 2T[IQVWL KPUVTWMELú UVJ FDJ RTGRCTG USN 9[MQPCL KPUVTWMELú UVJ GZGEWVG YJKNG O[ TQYTGH UVJ HGVEJTQYACTTC[TGH ] O[ CWVJQTAPCOG CWVJQTAKF ] TQYTGH_ CWVJQTU] CWVJQTAPCOG_ CWVJQTAKF _ 2QDKGT Y[FCYEÎY K WE[ KEJ MNWECOK VCDNKE[ CUQELCE[LPGL O[ RWDNKUJGTU USN 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF USN (41/ 2WDNKUJGTU 2T[IQVWL KPUVTWMELú UVJ FDJ RTGRCTG USN 9[MQPCL KPUVTWMELú UVJ GZGEWVG YJKNG O[ TQYTGH UVJ HGVEJTQYACTTC[TGH ] O[ RWDNKUJGTAPCOG RWDNKUJGTAKF ] TQYTGH_ RWDNKUJGTU] RWDNKUJGTAPCOG_ RWDNKUJGTAKF _
  24. 24. Rozdział 12. n Tworzenie aplikacji dla baz danych 299 2QDKGT KPHQTOCELú QF W [VMQYPKMC O[ KUDP IGVAKPHQ +5$0 O[ VKVNG IGVAKPHQ V[VW 2QDKGT YKGNW CWVQTÎY O[ CWVJQTU YJKNG O[ CWVJQT IGVAKPHQ CWVQTC MG[U CWVJQTU ] NCUV WPNGUU CWVJQT RWUJ CWVJQTU CWVJQT _ O[ RWDNKUJGT IGVAKPHQ Y[FCYEú MG[U RWDNKUJGTU O[ RCIGU IGVAKPHQ NKEDú UVTQP O[ RWDAFCVG IGVAKPHQ FCVú Y[FCPKC ;;;;// O[ WUAFQNNCTARTKEG IGVAKPHQ EGPú Y FQNCTCEJ 9UVCY FQ DC[ PQYæ MUKæ Mú USN +05'46 +061 $QQMU USN KUDP VKVNG RWDNKUJGTAKF PWOARCIGU USN RWDAFCVG WUAFQNNCTARTKEG USN 8#.7'5 ! ! ! ! ! ! UVJ FDJ RTGRCTG USN UVJ GZGEWVG KUDP VKVNG RWDNKUJGTU] RWDNKUJGT_ RCIGU RWDAFCVG WUAFQNNCTARTKEG O[ PGYADQQMAQKF UVJ ]RIAQKFAUVCVWU_ UVJ HKPKUJ 7 [L KFGPV[HKMCVQTC 1+ PQYGL MUKæ MK FQ RQDTCPKC DQQMAKF USN 5'.'%6 DQQMAKF USN (41/ $QQMU USN 9*'4' QKF ! 2T[IQVWL KPUVTWMELú UVJ FDJ RTGRCTG USN 9[MQPCL KPUVTWMELú UVJ GZGEWVG PGYADQQMAQKF 2QDKGT DQQMAKF YKGTUC Q KFGPV[HKMCVQTG 1+ O[ PGYADQQMAKF UVJ HGVEJTQYACTTC[ UVJ HKPKUJ 9UVCY RQYKæCPKG MUKæ MK CWVQTGO USN +05'46 +061 $QQM#WVJQTU DQQMAKF CWVJQTAKF 8#.7'5 ! ! UVJ FDJ RTGRCTG USN
  25. 25. 300 Perl HQTGCEJ O[ CWVJQT CWVJQTU ] UVJ GZGEWVG PGYADQQMAKF CWVJQTU] CWVJQT_ RTKPV )QVQYGP _ +PUVTWMELC CMQ EQPC UVJ HKPKUJ ,G NK YU[UVMQ RQU Q FQDTG CVYKGTFCO[ VTCPUCMELú FDJ EQOOKV CO[MCO[ RQ æEGPKG DCæ FCP[EJ FDJ FKUEQPPGEV 2TQEGFWTC RQDKGTCLæEC KPHQTOCELG QF W [VMQYPKMC UWD IGVAKPHQ ] O[ SWGUVKQP UJKHV O[ EQORNGVKQPU A O[ EQORNGVKQPUAJCUJ OCR ] A _ EQORNGVKQPU O[ KPRWV 7 [YCO[ 6GTO%QORNGVG LG NK VTGDC WWRG PKè FCPG KH EQORNGVKQPU ] KPRWV %QORNGVG 2QFCL SWGUVKQP MUKæ MK MG[U EQORNGVKQPUAJCUJ _ ,G NK PKG OC VCMKGL RQVTGD[ TQRQE[PCO[ UVCPFCTFQYQ GNUG ] RTKPV 2QFCL SWGUVKQP MUKæ MK KPRWV 2QDKGT FCPG QF W [VMQYPKMC EJQOR KPRWV 7UW MQ EC PCM PQYGIQ YKGTUC KPRWV ` U@U I 7UW URCELG RQEæVMW KPRWV ` UU I 7UW URCELG MQ EC _ TGVWTP KPRWV _ Mimo i program insert-book.pl nie obsługuje kategorii, nietrudno domyślić się, jak powi- nien wyglądać odpowiedni kod, który nale ałoby w tym celu dodać do programu. 12.2.5. Pobieranie informacji o ksią kach Teraz, gdy baza danych księgarni jest gotowa, pora przygotować prostą aplikację wykonu- jącą zapytania, które umo liwią u ytkownikom zdobycie informacji na temat konkretnych ksią ek. Napiszemy przykładowy program, który będzie zwracał ksią ki o tytułach zawie- rających tekst wprowadzony przez u ytkownika.
  26. 26. Rozdział 12. n Tworzenie aplikacji dla baz danych 301 Warto zauwa yć, e najpierw wczytujemy wszystkie informacje o ksią ce do tablicy aso- cjacyjnej DQQM, a dopiero później je wyświetlamy. Dzieje się tak, poniewa baza Postgre- SQL zwróci po jednym wierszu dla ka dego autora ksią ki. Gdybyśmy po prostu wyświe- tlili wyniki, tak jak są one zwracane przez bazę danych, ksią ki mające dwóch autorów byłyby wyświetlane dwukrotnie, a ksią ki mające pięciu autorów — a pięć razy! Unik- niemy takich powtórzeń, wczytując wszystkie zwrócone ksią ki do tablicy asocjacyjnej ta- blic asocjacyjnych, którą następnie posortujemy i wyświetlimy to, co nam pozostanie. Porządek, w jakim będą zwracane wyniki, mo e wydawać się nieistotny, skoro i tak zostaną one uporządkowane w pętli HQTGCEJ. Nie jest to jednak do końca prawda: autorzy są doda- wani do tablicy asocjacyjnej DQQM w takim samym porządku, w jakim są pobierani. Dlatego właśnie klauzula 14'4 $; upewnia się, e zwracane wiersze będą uporządkowane według nazwisk autorów. Aby uniknąć pomyłek, które mogą być spowodowane ró nicami w wielkości liter, wyko- rzystywana jest funkcja .19'4 języka SQL, która powoduje zamianę wszystkich wielkich znaków ciągów, które są jej argumentami, na małe: WUTDKPRGTN PCYC RNKMW SWGT[VKVNGRN WUG UVTKEV WUG YCTPKPIU WUG $+ RTKPV SS]9KVCO[ Y RTQITCOKG CR[VCPKC PP_ 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 4CKUG'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT 2QDKGT V[VW QF W [VMQYPKMC RTKPV 2QFCL RQUWMKYCP[ PCRKU O[ VCTIGV EJQOR VCTIGV 9G Y EWF[U ÎY OGVCPCMK 53. VCTIGV ` U^ ^ ^I VCTIGV ` U^A^A^I 2TGMUVC è C EWEJ Y Y[TC GPKG TGIWNCTPG 53. VCTIGV VCTIGV 7VYÎT CR[VCPKG O[ USN 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $PWOARCIGU USN $RWDAFCVG $WUAFQNNCTARTKEG #CWVJQTAPCOG USN (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $# USN 9*'4' .19'4 $VKVNG .+-' .19'4 ! USN #0 $#CWVJQTAKF #CWVJQTAKF USN #0 $DQQMAKF $#DQQMAKF USN #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF USN 14'4 $; #CWVJQTAPCOG
  27. 27. 302 Perl 2T[IQVWL KPUVTWMELú O[ UVJ FDJ RTGRCTG USN 9[MQPCL KPUVTWMELú O[ UWEEGUU UVJ GZGEWVG VCTIGV KH UWEEGUU ] O[ DQQM YJKNG O[ TQYTGH UVJ HGVEJTQYACTTC[TGH ] O[ KUDP VKVNG RWDNKUJGT RCIGU FCVG RTKEG CWVJQT TQYTGH CEJQYCL KPHQTOCELú Q MUKæ EG Y DQQM DQQM] KUDP_ ]VKVNG_ VKVNG DQQM] KUDP_ ]RWDNKUJGT_ RWDNKUJGT DQQM] KUDP_ ]RCIGU_ RCIGU DQQM] KUDP_ ]FCVG_ FCVG DQQM] KUDP_ ]RTKEG_ RTKEG CLOKL UKú CWVQTCOK KH DQQM] KUDP_ ]CWVJQT_ ] DQQM] KUDP_ ]CWVJQT_ CWVJQT _ GNUG ] DQQM] KUDP_ ]CWVJQT_ CWVJQT _ _ 2TGLT[L MUKæ MK Y RúVNK K Y[ YKGVN KPHQTOCELG Q PKEJ HQTGCEJ O[ KUDP UQTV ] DQQM] C_ ]VKVNG_ EOR DQQM] D_ ]VKVNG__ MG[U DQQM ] RTKPV P RTKPV DQQM] KUDP_ ]VKVNG_P RTKPV Z NGPIVJ DQQM] KUDP_ ]VKVNG_ P RTKPV #WVQT DQQM] KUDP_ ]CWVJQT_P RTKPV +5$0 KUDPV9[FCYEC DQQM] KUDP_ ]RWDNKUJGT_P RTKPV CVC Y[FCPKC DQQM] KUDP_ ]FCVG_V RTKPV %GPC DQQM] KUDP_ ]RTKEG_P RTKPV .KEDC UVTQP DQQM] KUDP_ ]RCIGU_P _ KH UVJ TQYU ] RTKPV $TCM MUKæ GM RCUWLæE[EJ FQ YQTECP _ _ GNUG ] RTKPV $ æF RT[IQVQYCPKC CR[VCPKC $+GTTUVT _ UVJ HKPKUJ FDJ FKUEQPPGEV
  28. 28. Rozdział 12. n Tworzenie aplikacji dla baz danych 303 12.3. Usuwanie błędów w programach korzystających z DBI Perl jest językiem programowania, w którym błędy wykrywa się bardzo łatwo. Wielu pro- gramistów zamiast korzystać z wbudowanego debuggera (patrz: sekcja 13.4.2), po prostu wstawia do kodu kilka instrukcji RTKPV. Tego rodzaju techniki nie zawsze jednak wystar- czają, gdy korzystamy z interfejsu $+. Jeśli na przykład program zakończy pracę w wyniku błędu bazy danych po próbie wykona- nia instrukcji +05'46 wstawiającej wiersz do bazy danych $QQM#WVJQTU, dobrze by było wie- dzieć, jak dokładnie wyglądało ostateczne zapytanie SQL, zanim zostało wysłane do bazy danych. Jeśli korzystamy w zapytaniu z symboli zastępczych, oka e się, e uzyskanie tego rodzaju informacji jest bardzo trudne. Rozwiązaniem jest metoda FDJ VTCEG , która pomaga w usuwaniu błędów z programów korzystających z interfejsu $+. Wymaga ona jednego obowiązkowego argumentu, który powinien być liczbą całkowitą z przedziału od 0 (zupełny brak wykrywania błędów) do 9 (poziom wykrywania błędów oferujący znacznie więcej informacji ni prawdopodobnie kiedykolwiek będziesz potrzebować). Drugi argument jest opcjonalny i podaje nazwę pliku na dysku, do którego mają być zapisywane informacje debugowania. Domyślnie wszystkie informacje dostarczane przez metodę FDJ VTCEG trafiają do standardowego strumienia błędów 56'44. Po aktywacji metoda FDJ VTCEG działać będzie przez cały czas pracy programu lub do momentu, gdy zostanie wyłączona. Bardzo często metodę FDJVTCEG wykorzystuje się w trakcie tworzenia programu, by wyłączyć ją, kiedy program zaczyna normalne działanie. Mo na równie wywołać metodę VTCEG jako metodę klasy wprost z modułu $+, wpisując $+ VTCEG . Pozwoli to na śledzenie działania metody $+ EQPPGEV , która zwraca uchwyt bazy danych FDJ. eby pokazać, jakie informacje zwraca metoda FDJ VTCEG , zaprezentuję tutaj zapis działania programu insert-book.pl, dla którego metoda FDJ VTCEG została włączona na pierwszym poziomie debugowania. Do kodu programu insert-book.pl dodałem tylko jeden wiersz, zaraz po odwołaniu do metody $+ EQPPGEV : FDJ VTCEG VORKPUGTVDQQMVTCEGVZV Oto, co pojawiło się na ekranie podczas działania programu insert-book.pl: 2QFCL +5$0 MUKæ MK 2QFCL V[VW MUKæ MK + NKMG 2GTN 2QFCL CWVQTC MUKæ MK 4GWXGP / .GTPGT 2QFCL CWVQTC MUKæ MK 2QFCL Y[FCYEú MUKæ MK 2TGPVKEG*CNN 2QFCL NKEDú UVTQP MUKæ MK 2QFCL FCVú Y[FCPKC ;;;;// MUKæ MK 2QFCL EGPú Y FQNCTCEJ MUKæ MK )QVQYG
  29. 29. 304 Perl W tym czasie za kulisami moduł $+ zebrał następujące informacje o tej sesji: $+FD*#5* ZHE VTCEG NGXGN UGV VQ KP $+ PQVJTGCF FDFAFDA('6%* ('6%* CV $+RO NKPG FDFAFDA5614' 5614' #WVQ%QOOKV CV $+RO NKPG FDFAFDA5614' 5614' $GIWP9QTM CV $+RO NKPG DGIKPAYQTM CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV 5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU FDFAUVARTGRCTUG UVCVGOGPV 5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU RTGRCTG 5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU %1' $+UV*#5* Z CV KPUGTVDQQMRN NKPG FDFAUVAGZGEWVG GZGEWVG %1' CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ HGVEJTQYACTTC[TGH = (QQ $CT ? TQY CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ FDFAUVAHGVEJ HGEVJTQYACTTC[TGH WPFGH TQY CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU FDFAUVARTGRCTUG UVCVGOGPV 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU RTGRCTG 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU %1' $+UV*#5* ZFE CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH CV KPUGTVDQQMRN NKPG FDFAUVAGZGEWVG GZGEWVG %1' CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ HGVEJTQYACTTC[TGH = 2TGPVKEG*CNN ? TQY CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ FDFAUVAHGVEJ FDFAUVAHGVEJ HGVEJTQYACTTC[TGH WPFGH TQY CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV +05'46 +061 $QQMU KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 ! ! ! ! ! ! FDFAUVARTGRCTUG UVCVGOGPV +05'46 +061 $QQMU KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 ! ! ! ! ! ! RTGRCTG +05'46 +061 $QQMU KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 ! ! ! ! ! ! %1' $+UV*#5* ZHG CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH CV KPUGTVDQQMRN NKPG FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF
  30. 30. Rozdział 12. n Tworzenie aplikacji dla baz danych 305 FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF FDFAUVAGZGEWVG GZGEWVG + NKMG 2GTN CV KPUGTVDQQMRN NKPG FDFAUVA('6%* ('6%* CV KPUGTVDQQMRN NKPG HKPKUJ CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV 5'.'%6 DQQMAKF (41/ $QQMU 9*'4' QKF ! FDFAUVARTGRCTUG UVCVGOGPV 5'.'%6 DQQMAKF (41/ $QQMU 9*'4' QKF ! RTGRCTG 5'.'%6 DQQMAKF (41/ $QQMU 9*'4' QKF ! %1' $+UV*#5* ZF CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH CV KPUGTVDQQMRN NKPG FDFADKPFARJ FDFAUVATGDKPF FDFAUVAGZGEWVG GZGEWVG %1' CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ HGVEJTQYACTTC[ = KVGOU? TQY CV KPUGTVDQQMRN NKPG FDFAUVAHKPKUJ HKPKUJ CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV +05'46 +061 $QQM#WVJQTU DQQMAKF CWVJQTAKF 8#.7'5 ! ! FDFAUVARTGRCTUG UVCVOGPV +05'46 +061 $QQM#WVJQTU DQQMAKF CWVJQTAKF 8#.7'5 ! ! RTGRCTG +05'46 +061 $QQM#WVJQTU DQQMAKF CWVJQTAKF 8#.7'5 ! ! %1' $+UV*#5* ZG CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH CV KPUGTVDQQMRN NKPG FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF FDFAUVAGZGEWVG GZGEWVG CV KPUGTVDQQMRN NKPG HKPKUJ CV KPUGTVDQQMRN NKPG FDFAFDAEQOOKV EQOOKV CV KPUGTVDQQMRN NKPG FDFAFDA5614' 5614' #WVQEQOOKV CV KPUGTVDQQMRN NKPG FDFAFDAFKUEQPPGEV FKUEQPPGEV CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH FDFAUVAFGUVTQ[ '5641; WPFGH Jak widać, metoda FDJ VTCEG dostarcza kompletnego dziennika rejestrującego ka dą zmianę atrybutu oraz ka dą wywołaną metodę RTGRCTG, GZGEWVG lub FDJ EQOOKV .
  31. 31. 306 Perl 12.4. Podsumowanie W tym rozdziale poszerzyliśmy wiedzę na temat teorii baz danych. Poznaliśmy równie kilka standardowych rozwiązań z zakresu projektowania baz danych, które niezmiernie uła- twiają tworzenie prawdziwych aplikacji współpracujących z bazami. Przyjrzeliśmy się do- kładnie przykładowym programom obsługującym katalog ksią ek oferowanych przez pewną księgarnię. W szczególności omawialiśmy: n znaczenie normalizacji danych, która czyni bazy danych wydajniejszymi i łatwiejszymi w obsłudze, n sposoby projektowania bazy danych, tak by była jak najwszechstronniejsza i pozostawała wydajna, niezale nie od tego, ile informacji będzie przechowywać, n wykorzystanie modułu 6GTO%QORNGVG do narzucania ograniczeń na dane wprowadzane przez u ytkownika, n korzystanie z metody FDJ VTCEG ułatwiającej wyszukiwanie błędów w aplikacjach dla baz danych.

×