Powszechnie wiadomo, że najlepszym sposobem na nauczenie się czegoś jest przećwiczenie tego w prawdziwym scenariuszu. Oczywiście to samo dotyczy modelowania baz danych. Dlatego w tym artykule postanowiłem nauczyć Cię tworzenia prostej struktury bazy danych na podręcznikowym przykładzie systemu rezerwacji pokoi hotelowych. Pokażę Ci, jak zacząć i przedstawię kilka pomysłów na rozszerzenie modelu.
Modelowanie bazy danych:odkrywaj, odkrywaj, odkrywaj
W tym artykule zaprojektujemy model danych dla systemu rezerwacji pokoi hotelowych. Szukamy modelu danych, w którym możemy przedstawić informacje o pokojach, gościach i rezerwacjach zarezerwowanych w naszym wyimaginowanym Hotelu VERTABELO*****. Wszystkie te informacje będą przechowywane w tabelach.
Modelowanie baz danych to cykliczny proces odkrywania. Najpierw identyfikujemy główne tabele i ich atrybuty. W naszym modelu główne stoły to:room
, guest
i reservation
. Następnie kontynuujemy ulepszanie naszych tabel, odkrywając ich atrybuty lub kolumny. Na przykład room
tabela ma atrybuty takie jak:room number
, name
i smoke
flaga między innymi.
Reservation
tabela ma atrybuty date_in
, date_out
, status
(anulowane, potwierdzone) i made_by
(online, in_person, telefon, mail), natomiast atrybuty tabeli guest
są:first_name
, last_name
i member_since
. Być może masz ochotę na reservation
stół potrzebuje więcej atrybutów (takich jak rodzaj pokoju, liczba łóżek), omówimy ten punkt później, do tego czasu rozważ naszą reservation
tabela niekompletna. Poniższy model danych utworzony w Vertabelo pokazuje główne tabele.
Typy danych:jakie są domeny dozwolonych wartości dla kolumny?
Zauważ, że każda kolumna ma typ danych (varchar, integer, date, boolean), aby wskazać, jakiego rodzaju wartości można przypisać do kolumny. Na przykład kolumna smoke
na stole room
jest wartość logiczna typ danych, co oznacza, że dozwolone są tylko prawda lub fałsz.
Klucze podstawowe:numer ubezpieczenia społecznego każdego rekordu
Każda tabela powinna mieć kolumnę (lub więcej niż jedną) działającą jako identyfikator dla każdego rekordu w tabeli. Ta kolumna nazywa się kluczem podstawowym (PK), a najlepsze praktyki dotyczące projektowania baz danych sugerują, że każda tabela musi mieć klucz PK.
Jeśli spojrzymy na poprzedni model danych Vertabelo, zobaczymy, że każda tabela ma kolumnę o nazwie id
ze wskaźnikiem PK po prawej stronie. Te kolumny id tworzą PK (w konwencji nazywamy id
kolumna PK).
Ważną koncepcją, być może oczywistą dla wielu czytelników, jest to, że kolumna PK nie może mieć zduplikowanych wartości. Innymi słowy, każda kolumna PK ma unikalne ograniczenie, a każda próba utworzenia nowego rekordu ze zduplikowaną wartością zostanie odrzucona z błędem przez menedżera bazy danych.
Kontynuuj odkrywanie; Znajdź nowe obiekty bazy danych
Rezerwacja jest jednym z bardziej złożonych elementów do reprezentowania w tym modelu danych. Z jedną rezerwacją może być powiązanych wiele pokoi (np. „Chcę dokonać rezerwacji na jeden pokój dwuosobowy i osobny pokój z 3 łóżkami dla moich dzieci”). To wymaganie biznesowe dodaje 4 rzeczy do naszego modelu:
Nowa tabela: Musimy utworzyć nową tabelę o nazwie room_reserved
, gdzie przechowujemy wszystkie pokoje należące do jednej rezerwacji.
Dodaj dwa odniesienia: Odwołanie jest bardzo ważnym elementem modelu danych. Odwołanie opisuje, w jaki sposób jedna tabela jest powiązana z inną tabelą. W naszym modelu każdy zarezerwowany pokój należy do jednej rezerwacji, dlatego będziemy używać odniesienia do modelu tego faktu. To odniesienie jest przedstawione graficznie jako linia łącząca obie tabele.
Co więcej, ponieważ każda rezerwacja należy do jednego gościa, musimy utworzyć nową referencję łączącą guest
i reservation
tabele.
Przenieś kolumnę: Ponieważ możemy mieć kilka pokoi należących do jednej rezerwacji, musimy zezwolić na anulowanie na pojedynczy pokój, po czym przesuwamy attribute
stan z reservation
do reserved_room
tabela.
Zaktualizowany model danych jest przedstawiony na poniższym diagramie zaprojektowanym w Vertabelo:
Co się dzieje z tabelami połączonymi odnośnikiem?
Kiedy tworzymy odwołanie między dwiema tabelami, do jednej z tabel dodawana jest nowa kolumna. Ta właśnie dodana kolumna nazywa się kluczem obcym i działa jako wskaźnik do innej tabeli, umożliwiając połączenia między tabelami. Na przykład spójrz na następujące diagramy:
Rys. 1 Stoły reservation
i guest
przed i po dodaniu referencji
Kontynuuj odkrywanie; Idź po więcej
Jednym z punktów, który czeka na modelowanie, jest fakt, że pokoje mogą być używane przez pewien czas przez niektórych gości. Aby przedstawić ten fakt biznesowy, dodaliśmy 2 tabele:hosted_at
i occupied_room
.
Pamiętaj, że każda osoba, która zatrzymała się w hotelu, będzie miała wpis w hosted_at
. Ten zapis będzie zawierał odniesienie do zajmowanego przez niego pokoju i gościa. Dlatego hosted_at
ma podwójne odniesienie do guest
i occupied_room
.
Stół occupied_room
będzie miał jeden rekord na każdy wynajmowany pokój, na tym rekordzie znajdziemy pola:check_in
i check_out
typu znacznik czasu wskazujący rozpoczęcie i zakończenie najmu. Typ danych znacznika czasu przechowuje punkt w czasie z dowolną precyzją. Każdy occupied_room
rekord będzie również zawierał odniesienie do numeru wynajmowanego pokoju i pośrednio przez hosted_at
dla gości, którzy mieszkali w tym pokoju.
Dodaliśmy również tabelę room_type
do modelu danych; chodzi o to, aby pogrupować pokoje według kategorii lub typu pokoju. Na przykład „standardowe jedno podwójne łóżko”, „luksusowe 2 podwójne łóżka” mogą być opisami typów. Mamy tutaj również atrybut max_capacity.
Ćwiczenia: Projektowanie baz danych jest dyscypliną łatwą w podejściu, jednak potrzeba czasu, aby stać się ekspertem w danej dziedzinie. Jeśli robisz pierwsze kroki w projektowaniu bazy danych, spróbuj uzupełnić bieżący model danych, aby umożliwić:
- Jeśli dwóch lub więcej gości dzieli pokój, zezwól na różne zameldowanie i wymeldowanie dla każdego gościa.
- W niektórych przypadkach hotele mogą zmienić konfigurację pokoi (np. ze standardowego jednego podwójnego łóżka na luksusowe 2 podwójne łóżka). Dodaj do modelu danych elementy reprezentujące te zmiany konfiguracji, zachowując historię każdego pokoju.