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.
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. =#?
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. 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. 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. 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. 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
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. 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. 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. 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 $+
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. 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
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
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.