Struktura wewnętrzna bazy składa się z 7 tabel głównych i 4 tabel - słowników. Tabele główne są modelem, który opisuje fragment działalności hotelu, związany z realizowaniem rezerwacji przez klientów. Tabele słowniki są tabelami pomocniczymi, które przechowują statusy rekordów w poszczególnych modułach systemu bazy danych.
Tabele główne:
reservation
- przechowuje wszystkie rezerwacjereservation_room
- łączy rezerwacje, z pokojami które są rezerwowaneroom
- reprezentuje pokoje w hoteluroom_type
- przechowuje charakterystyki pokoi, liczbę dostępnych łóżek, ceny i inne udogodnieniauser_account
- przechowuje konta użytkowników systemuuser_details
- przechowuje dane kontaktowe klientówinvoice
- reprezentuje faktury wystawiane do zamówieńservice
- przechowuje dostępne usługi hotelureservation_service
- łączy rezerwacje z wykupionymi usługamiTabele słowniki:
dict_reservation_status
dict_reservation_room_status
dict_room_status
dict_invoice_status
Na rezerwację składają się:
user_account
a następnie user_details
)reservation
):
reservation_room
)Na pokój składa się:
room
room_type
):
Na profil klienta składa się:
user_account
user_details
Na fakturę składa się:
invoice
reservation
:reservation_room
(określenie jakich pokoi dotyczy faktura)user_account
i user_details
(określenie nabywcy)Użytkownikiem jest zarówno administrator jak i osoba rezerwująca pokój.
Administrator jest oznaczony specjalną flagą is_admin
.
Administrator nie musi mieć wypełnionych danych w tabeli user_details
.
Struktura zewnętrzna bazy danych (widziana przez Backend
) składa się z 5 widoków, które można ze sobą łączyć.
classDiagram
direction LR
class reservation_view {
reservation_id
customer_id
reservation_room_id
reservation_last_modified_by
INSERT()
UPDATE()
}
class room_view {
room_id
room_last_modified_by
INSERT()
UPDATE()
}
class customer_view {
customer_id
customer_last_modified_by
INSERT()
UPDATE()
}
class user_view {
user_id
user_last_modified_by
insert_user_account() user_id
update_user_account_password() user_id
authenticate_user_account() user_id
UPDATE()
}
class invoice_view {
invoice_id
invoice_reservation_id
invoice_last_modified_by
INSERT()
UPDATE()
}
class service_view {
reservation_id
service_last_modified_by
INSERT()
UPDATE()
}
reservation_view <--> customer_view : (customer_id - customer_id)
reservation_view <--> room_view : (reservation_room_id - room_id)
reservation_view <--> user_view : (reservation_last_modified_by - user_id)
room_view <--> user_view : (room_last_modified_by - user_id)
customer_view <--> user_view : (customer_id - user_id)
customer_view <--> user_view : (customer_last_modified_by - user_id)
user_view <--> user_view : (user_last_modified_by - user_id)
invoice_view <--> reservation_view: (invoice_reservation_id - reservation_id)
invoice_view <--> user_view : (user_last_modified_by - user_id)
service_view <--> reservation_view: (service_reservation_id - reservation_id)
service_view <--> user_view : (service_last_modified_by - user_id)
Podstawowe operacje jak aktualizowanie istniejących danych czy wprowadzanie nowych,
realizuje się za pomocą standardowych instrukcji UPDATE
czy INSERT
.
Wyjątkiem są operacje związane z user_view.
Tabele poniżej przedstawiają które pola widoków i jaką instrukcja można modyfikować.
Pole _last_modified_at
nie można modyfikować, ponieważ jest ono odświeżane automatycznie podczas wykonywania innych operacji.
Pole _last_modified_by
w każdej tabeli odnosi się do user_ID
z widoku user_view
.
Wszystkie pola z suffixem _id
muszą zawierać wartości istniejące w tabelach powiązanych kluczem obcym,
wszystkie odwołują się do pola o nazwie ID
w tabelach jak poniżej.
Nazwa kolumny w widoku | Widok | Tabela | Dostępne w widoku |
---|---|---|---|
reservation_customer_id | reservation_view | user_account | customer_view |
reservation_status_id | reservation_view | dict_reservation_status | -- |
reservation_room_id | reservation_view | room | -- |
reservation_room_status_id | reservation_view | dict_reservation_room_status | -- |
room_type_id | room_view | room_type | room_view |
room_status_id | room_view | dict_room_status | -- |
customer_id | customer_view | user_account | customer_view |
invoice_status_id | invoice_view | dict_invoice_status | -- |
invoice_reservation_id | invoice_view | reservation | reservation_view |
service_reservation_id | service_view | reservation | reservation_view |
Nazwa kolumny w widoku | UPDATE | INSERT |
---|---|---|
reservation_id | ||
reservation_customer_id | X | |
reservation_status_id | X | |
reservation_number_of_adults | X | X |
reservation_number_of_children | X | X |
reservation_start_date | X | X |
reservation_end_date | X | X |
reservation_room_id | X | X |
reservation_room_status_id | X | |
reservation_last_modified_by | X | X |
reservation_last_modified_at |
reservation_id
<- generowane automatycznie.reservation_customer_id
<- przepisanie rezerwacji do klienta jest możliwe tylko podczas tworzenia rezerwacji.reservation_status_id
<- podczas operacji INSERT
ustawiana jest wartość domyślna (pozycja 1. w dict_reservation_status
).reservation_room_status_id
<- podczas operacji INSERT
ustawiana jest wartość domyślna (pozycja 1. w dict_reservation_room_status
).Nazwa kolumny w widoku | UPDATE | INSERT |
---|---|---|
room_id | X | |
room_type_id | X | X |
room_status_id | X | |
room_number_of_single_beds | ||
room_number_of_double_beds | ||
room_number_of_child_beds | ||
room_gross_price | X | X |
room_gross_price_adult | ||
room_gross_price_child | ||
room_photos_dir | ||
room_last_modified_by | X | X |
room_last_modified_at |
room_id
<- zmiana numeru pokoju po jego wprowadzeniu nie jest możliwa.room_status_id
<- podczas operacji INSERT
ustawiana jest wartość domyślna (pozycja 1. w dict_room_status
).room_number_of_single_beds
room_number_of_double_beds
room_number_of_child_beds
room_gross_price_adult
room_gross_price_child
room_photos_dir
Nazwa kolumny w widoku | UPDATE | INSERT |
---|---|---|
customer_id | X | |
customer_nip_number | X | X |
customer_name | X | X |
customer_surname | X | X |
customer_email | ||
customer_phone | X | X |
customer_city | X | X |
customer_postal_code | X | X |
customer_street | X | X |
customer_building_number | X | X |
customer_last_modified_by | X | X |
customer_last_modified_at |
customer_id
<- należy podać ID
user_account
, do które dane adresowe mają być przypisane, później nie można przypisać tych danych do innego użytkownika.customer_email
<- jest wartością niezbędną do autentykacji użytkowników - klientów, więc jego modyfikacja jest możliwa tylko za pośrednictwem user_view
.Nazwa kolumny w widoku | UPDATE | INSERT |
---|---|---|
invoice_id | ||
invoice_reservation_id | X | |
invoice_date | ||
invoice_price_gross | X | X |
invoice_is_paid | X | |
invoice_status_id | X | |
user_last_modified_by | X | |
user_last_modified_at |
invoice_id
<- generowane automatycznie.invoice_reservation_id
<- modyfikowana tylko podczas operacji INSERT
, ponieważ nie można przepisać faktury z jednego zamówienia na inne.invoice_reservation_id
<- generowane automatycznie.invoice_is_paid
<- podczas operacji INSERT
ustawiana jest wartość domyślna (FALSE).invoice_status_id
<- podczas operacji INSERT
ustawiana jest wartość domyślna (pozycja 1. w dict_invoice_status
).Nazwa kolumny w widoku | UPDATE | INSERT |
---|---|---|
user_id | ||
user_e_mail | X | |
user_name | X | |
user_is_active | X | |
user_is_admin | X | |
user_last_modified_by | X | |
user_last_modified_at |
user_id
<- generowane automatycznie.Poniższe operacje nie są możliwe do wykonania przy użyciu instrukcji UPDATE
czy INSERT
.
utworzenie nowego użytkownika
insert_user_account(login, user_password, last_modified_by_id)
-
hasła nie są dostępne z poziomu user_view
,
więc żeby zapobiec ich udostępnianiu wprowadzanie nowych użytkowników odbywa się za pomocą osobnej funkcji.
Funkcja zwraca ID
nowego użytkownika, jeśli operacja zakończy się sukcesem.
NULL
zostanie to zinterpretowane, jakby użytkownik sam założył konto.zmiana hasła
update_user_account_password(login, new_user_password, old_user_password, last_modified_by_id)
Funkcja zwraca ID użytkownika, jeśli operacja przebiegła pomyślnie, w przeciwnym wypadku zwraca null oraz błąd.autentykacja istniejącego użytkownika za pomocą loginu i hasła:
authenticate_user_account(login, user_password)
-
Funkcja zwraca ID użytkownika, jeśli autentykacja przebiegła pomyślnie,
w przeciwnym wypadku zwraca null i/oraz błąd, jeśli użytkownik nie istnieje.
Nazwa kolumny w widoku | UPDATE | INSERT |
---|---|---|
service_id | ||
service_name | X | X |
service_price | X | X |
service_reservation_id | X | |
service_quantity | X | X |
service_last_modified_by | X | |
service_last_modified_at |
service_id
<- generowane automatycznie.service_reservation_id
<- można ustawić tylko przy instrukcji INSERT