Bazy Danych I Projekt Firma Turystyczna Autor: Paweł Bara 1. Struktura bazy danych. Baza danych ma stanowić magazyn informacji o transakcjach prowadzonych przez pewne biuro podróży. Biuro to sprzedaje wyjazdy\pobyty wzbogacone o rozmaite usługi\atrakcje. Klientami mogą być zarówno osoby prywatne jak i firmy. Moment podpisania umowy jest momentem utworzenia zamówienia w bazie, wcześniej wycieczkę i jej usługi\atrakcje można rezerwować. Klienci osoby prywatne bądź firmy, korzystające z oferty biura podróży. Usługi zbiór usług świadczonych podczas trwania wycieczek z oferty. Atrakcje zbiór atrakcji, które wiążą się z wycieczkami z oferty. Wycieczki każda wycieczka jest wyjazdem jedno lub kilkudniowym, odbywającym się w danym terminie, do jednego lub kilku krajów. Wycieczka może zawierać tylko ściśle określoną ilość uczestników. Z wyjazdem wiążą się pewne atrakcje i usługi (zero lub więcej, każda z określoną ilością miejsc). Wszystkie wycieczki mają również powiązaną ze sobą listę miejsc noclegu (jeśli takowe występują). Rezerwacje rezerwacja jest składana na podstawowe dane osobowe imię, nazwisko, telefon. Rezerwujący zamawia określoną ilość miejsc na daną wycieczkę oraz powiązane z nią atrakcje/usługi. Jeżeli rezerwacja nie zostanie sfinalizowana płatnością w określonym terminie, traktujemy ją jako nieważną. Zamówienia zamówienie jest składane przez konkretnego płatnika (klienta) na konkretną wycieczkę. Klient wykupuje określoną ilość miejsc na wycieczkę oraz jej atrakcje/usługi. Z zamówieniem oraz jego atrakcjami/usługami wiąże się pewna ilość uczestników (płatnik nie musi uczestniczyć w wycieczce). 2. Warunki integralności. Ogólne: w każdej tabeli obowiązują podstawowe ograniczenia takie jak np. e mail postaci: %@ %. lub %@%., czy kod pocztowy postaci Klienci: poprawna postać NIP u zależna od tego czy klient jest firmą czy też osobą prywatną Hotele: standard: 1 5 gwiazdek, bądź 0, jeśli niekreślony
Rys. 1. Schemat bazy danych.
Wycieczki: ilość miejsc > 0 ilość zajętych miejsc >= 0 ilość zajętych miejsc zawsze mniejsza bądź równa ogólnej ilości miejsc data powrotu > daty wyjazdu Hotele wycieczki: termin wyjazdu z hotelu > terminu przyjazdu do hotelu oba terminy w granicach wycieczki Zamówienia: tylko jedno zamówienie na daną wycieczkę przez danego klienta ilość wykupionych miejsc > 0 ilość wykupionych miejsc <= ilości aktualnie dostępnych miejsc w wycieczce zniżka od 0% do 100% (od 0.00 do 1.00) data płatności co najwyżej trzy dni od podpisania umowy płatność musi być dokonana siedem dni przed terminem wycieczki, podobnie podpisanie umowy Rezerwacje: ilość zarezerwowanych miejsc > 0 ilość zarezerwowanych miejsc <= ilości aktualnie dostępnych miejsc w wycieczce płatność musi być dokonana siedem dni przed terminem wycieczki Atrakcje\usługi rezerwacji: ilość miejsc większa od 0 i mniejsza bądź równa ilości miejsc dostępnych na daną atrakcję\usługę w danej wycieczce ilość miejsc <= ogólnej ilości miejsc danej rezerwacji Atrakcje\usługi zamówienia: ilość kupowanych miejsc mniejsza bądź równa ilości miejsc dostępnych na daną atrakcję\usługę w danej wycieczce ilość uczestników atrakcji z ramienia danego zamówienia nie może być większa od ilości uczestników danego zamówienia Atrakcje\usługi wycieczki: ilość miejsc > 0 i ilość miejsc <= ilości miejsc na daną wycieczkę ilość zajętych miejsc >= 0 ilość zajętych miejsc zawsze mniejsza bądź równa ogólnej ilości miejsc Uczestnicy: ilość uczestników danego zamówienia nie może przekroczyć ilości miejsc wykupionych przez płatnika powiązanego z tym zamówieniem (powinna być jej równa)
3. Indeksy. Wszystkie tabele mają założone indeksy na swoje klucze główne. Dodatkowo: Rezerwacje: IdWycieczki oraz DataPlatnosci Wycieczki: Kraj Zamówienia: IdWycieczki Klienci: NIP 4. Funkcjonalność bazy danych. Uwaga: nie usuwamy, modyfikujemy, wstawiamy danych za pośrednictwem podstawowych zapytań SQL a. Zamiast tego korzystamy z opisanych niżej funkcji dołączonych do systemu. Wyjątki od tej reguły również opisano poniżej. Baza zapewnia cały niskopoziomowy interfejs funkcji dodających dane. Każda tabela ma powiązaną ze sobą funkcję, umieszczającą krotkę w relacji. Funkcje te dbają o zachowanie wszelkich warunków integralności. Nad interfejsem można z łatwością zbudować GUI umożliwiające wypełnianie bazy: dodaj_usluge (@NAZWA varchar(45), @OPIS text) dodaj_atrakcje (@NAZWA varchar(45), @OPIS text) dodaj_hotel (@NAZWA varchar(45), @STANDARD tinyint, @OPIS text, @ADRES varchar(45), @MIEJSCOWOSC varchar(45), @KRAJ varchar(45), @TELEFON varchar(25), @STRONA varchar(60)) dodaj_klienta (@NIP char(13), @NAZWAFIRMY varchar(25), @IMIE varchar(20), @NAZWISKO varchar(45), @ADRES varchar(45), @MIEJSCOWOSC varchar(45), @KODPOCZTOWY char(6), @KRAJ varchar(45), @TELEFON varchar(25), @FAX varchar(25), @EMAIL varchar(25), @STRONA varchar(60), @CZYFIRMA bit) dodaj_wycieczke (@KRAJ varchar(100), @ILOSCMIEJSC int, @ZAJETEMIEJSCA int, @CENAJEDNOSTKOWA smallmoney, @DATAWYJAZDU datetime, @DATAPOWROTU datetime) dodaj_hotel_wycieczki (@IDHOTELU int, @IDWYCIECZKI int, @DATAPRZYJAZDU datetime, @DATAWYJAZDU datetime) dodaj_atrakcje_wycieczki (@IDATRAKCJI int, @IDWYCIECZKI int, @ILOSCMIEJSC int, @ZAJETEMIEJSCA int, @CENAJEDNOSTKOWA smallmoney) dodaj_usluge_wycieczki (@IDUSLUGI int, @IDWYCIECZKI int, @ILOSCMIEJSC int, @ZAJETEMIEJSCA int, @CENAJEDNOSTKOWA smallmoney) dodaj_rezerwacje (@IDWYCIECZKI int, @IMIE varchar(20), @NAZWISKO varchar(45), @TELEFON varchar(25), @DATAPLATNOSCI datetime, @TYPPLATNOSCI char(7), @MIEJSCA int) dodaj_atrakcje_rezerwacji (@IDATRAKCJI int, @IDREZERWACJI int, @MIEJSCA int) dodaj_usluge_rezerwacji (@IDUSLUGI int, @IDREZERWACJI int, @MIEJSCA int) dodaj_zamowienie (@IDKLIENTA int, @IDWYCIECZKI int, @MIEJSCA int, @DATAUMOWY datetime, @DATAPLATNOSCI datetime, @TYPPLATNOSCI char(7), @ZNIZKA decimal(3,2)) dodaj_atrakcje_zamowienia (@IDATRAKCJI int, @IDZAMOWIENIA int, @IMIE varchar(20),
@NAZWISKO varchar(45)) dodaj_usluge_zamowienia (@IDUSLUGI int, @IDZAMOWIENIA int, @IMIE varchar(20), @NAZWISKO varchar(45)) dodaj_uczestnika (@IDKLIENTA int, @IDZAMOWIENIA int, @IMIE varchar(20), @NAZWISKO varchar(45), @ADRES varchar(45), @MIEJSCOWOSC varchar(45), @KRAJ varchar(45), @TELEFON varchar(25)) Jedynym elementem schematu, dla którego logiczną wydaje się operacja modyfikacji są ilości miejsc na rezerwację i baza zapewnia w tym celu odpowiednie procedury: zmien_atrakcje_rezerwacji (@IDATRAKCJI int, @IDREZERWACJI int, @MIEJSCA int) zmien_usluge_rezerwacji (@IDUSLUGI int, @IDREZERWACJI int, @MIEJSCA int) zmien_rezerwacje (@IDREZERWACJI int, @MIEJSCA int) Zamówienie jako wyraz pisemnej umowy jest niemodyfikowalne. Jeśli wyjątkowa zajdzie taka potrzeba można je zawsze usunąć (patrz niżej) i dodać ponownie. Dopuszcza się ręczne modyfikacje wszelkich elementów typu dane personalne, adres hotelu czy opis atrakcji, jako że nie mają one wpływu na integralność. System umożliwia usuwanie tych danych, które mogą się dezaktualizować, czyli rezerwacji i zamówień. Przyczyną konieczności usunięcia krotek z tych tabel może być nieopłacenie rezerwacji w ustalonym terminie bądź nie wywiązanie się przez klienta z warunków umowy. Funkcje usun_rezerwacje i usun_zamowienie dbają z pomocą triggerów o zachowanie integralności: usun_rezerwacje (@IDREZERWACJI int) usun_zamowienie (@IDZAMOWIENIA int) Dodatkowo do dyspozycji mamy funkcje umożliwiające usunięcie atrakcji\usługi z bazy (w tym z aktualnych wycieczek, zamówień, rezerwacji): usun_usluge (@IDUSLUGI int) usun_atrakcje (@IDATRAKCJI int) Pozostałe dane nie powinny być usuwane. Poza tym system dostarcza: funkcję listującą wszystkie niezbędne dane do faktury: dane_do_faktury(@idzamowienia int) funkcję wyszukującą dostępne wycieczki odbywające się w danym okresie, do danego kraju i nie droższe niż podana cena; pominięte parametry nie są uwzględniane przy operacji wyszukiwania: znajdz_wycieczke (@TERMINMIN datetime, @TERMINMAKS datetime, @KOSZTMAKS smallmoney, @KRAJ varchar(max)) funkcję wyszukującą rezerwacje z przedawnionym terminem płatności (do usunięcia): ktore_nieaktualne funkcje zliczające całkowity koszt zamówienia bądź rezerwacji:
koszt_rezerwacji (@IDREZERWACJI int) koszt_zamowienia (@IDZAMOWIENIA int) funkcje przekształcające zbiór krotek na łańcuch w formacie CSV (np. krotek zawierających nazwy atrakcji powiązane z daną wycieczką): uslugi_rezerwacji_to_csv (@IDREZERWACJI int) atrakcje_rezerwacji_to_csv (@IDREZERWACJI int) uslugi_zamowienia_to_csv (@IDZAMOWIENIA int) atrakcje_zamowienia_to_csv (@IDZAMOWIENIA int) uslugi_wycieczki_to_csv (@IDWYCIECZKI int) atrakcje_wycieczki_to_csv (@IDWYCIECZKI int) 5. Widoki. Baza zapewnia widoki dla pracowników biura (zestawienie zamówień bądź rezerwacji), dla organizatora wycieczki (dane osobowe uczestników wycieczek i związanych z nimi usług\atrakcji) oraz widoki ważne z punktu widzenia klienta (zestwienie wycieczek i ich usług\atrakcji). Widok 1. klient_wycieczki_view pokazuje wszystkie wycieczki z bazy, niezbędne informacje na ich temat oraz powiązane z nimi usługi\atrakcje Widoki 2, 3. klient_atrakcje_wycieczki_view oraz klient_uslugi_wycieczki_view pokazują atrakcje\usługi danej wycieczki oraz ilość wciąż wolnych miejsc na nie
Widoki 4, 5. biuro_rezerwacje_view oraz biuro_zamowienia_view pokazują podstawowe informacje o rezerwacjach\zamówieniach z bazy oraz ich wartości Widok 6. organizator_uczestnicy_view pokazuje listę uczestników każdej wycieczki (wraz z ich danymi osobowymi) Widoki 7, 8. organizator_uczestnicy_atrakcji view oraz organizator_uczestnicy_uslug_view pokazuje listę uczestników usług\atrakcji powiązanych z danymi wycieczkami (tylko imię i nazwisko, bo podstawie dane są zawarte widoku organizator_uczestnicy_wycieczki_view). 6. Prawa dostępu. Utworzyłem trzy konta: klient (hasło: ala123) mający jedynie prawo do przeglądania swoich widoków organizator (hasło: ala123) również tylko przeglądający swoje widoki biuro (hasło: ala123) dostę do wszystkich procedur, tabel, widoków; ograniczony dostęp jedynie do struktury bazy (brak możliwości modyfikowania postaci tabel)