Poprawność bazy danych - prośba o sprawdzenie

0

Witam serdecznie,

Robię prostą aplikację webową Spring MVC + Hibernate + Mysql służącą do rezerwacji biletów. Chciałem się doradzić odnośnie poprawności tej bazy danych. Czy jest to logicznie zrobione i ew. czy nie będzie później problemów z Hibernatem?

Tabele:
Pasazer (ID_PAS, IMIE, NAZWISKO, TELEFON)

Rezerwacja (ID_REZ, ID_PAS, ID_MIE, MIEJSCE_WYJAZDU, MIEJSCE_PRZYJAZDU, DATA, LICZBA_WOLNYCH_MIEJSC)

Miejsca(ID_MIE, NAZWA)

W tabeli Miejsca w kolumnie NAZWA będą przechowywane miejsca odjazdów.
Jeszcze pytanie odnośnie ilości dostępnych miejsc na poszczególny wyjazd. Jak zrobić sprawdzanie? Kolumna LICZBA_WOLNYCH_MIEJSC i na podstawie tego jakoś porównywać z np. MAX_ILOSC_MIEJSC ????

Dziękuję za wszelkie sugestie i rady.
Pozdrawiam!

0

Ja zrobiłbym osobną tabelkę Podroz, gdzie byłyby kolumny ID_PODROZ, MIEJSCE_WYJAZDU, MIEJSCE_PRZYJAZU, DATA, LICZBA_MIEJSC, a w Rezerwacja po prostu ID_PODROZ, o ile dobrze zrozumiałem problem.

Btw, dlaczego pierwsze dwie są nazwane w liczbie pojedynczej, a Miejsca w mnogiej?

0

Coś mi tu nie gra... (albo nie zrozumiałem zadania).

Napisałeś że,

W tabeli Miejsca w kolumnie NAZWA będą przechowywane miejsca odjazdów.
a w tabeli Rezerwacja masz pole MIEJSCE_WYJAZDU.

Ja bym zrobił to troszkę inaczej (nie wiem czy prawidłowo - koledzy ocenią).
Tabele:

TRASY (tr_id, tr_data, tr_MiejsceWyjazdu, tr_MiejscePrzyjazdu ,tr_LiczbaMiejsc)
PASAZEROWIE (pa_id, pa_imie, pa_nazwisko, pa_telefon)
REZERWACJE (ra_id, ra_trid, ra_paid)

.

Wtedy w tabeli rezerwacje przechowuje informacje jaki pasażer korzysta z jakiego połączenia i w bardzo prosty sposób sprawdzisz ile pasażerów ma rezerwację na daną trasę

SELECT SUM(ra_paid) FROM rezerwacje WHERE ra_trid = X

i porównasz z ilością miejsc SELECT tr_LiczbaNMiejsc FROM trasy WHERE tr_id = X

.

No ale niech zaawansowani koledzy podpowiedzą czy któryś z pomysłów ma sens ;)
1

@hipekk
Wszystko ok, tylko po co te wszystkie przedrostki rodzaju 'tr_' ? To jest zła praktyka i wbrew pozorom zaciemnia pogląd sytuacji. Jeżeli będziemy korzystać z kilku kolumn to tworzymy aliasy.

Korzystanie przez Ciebie z SUM jest błędne bo sumujesz id, a powinieneś zobaczyć ile jest takich wierszy czyli COUNT. Zaprezentowałeś rozwiązanie, w którym pasażer robi rezerwacje tylko na jedno miejsce, jeśli chcemy pozwolić zarezerwować kilka miejsc to powinno być dodatkowe pole w tabeli REZERWACJE. Warto też przechowywać datę przyjazdu

Więc bazując na tym co napisałeś:

TRASY (Id, DataOdjazd, DataPrzyjazd, MiejsceOdjazd, MiejscePrzyjazd ,IloscMiejsc)
PASAZEROWIE (Id, Imie, Nazwisko, Telefon)
REZERWACJE (Id, TrasaId, PasazerId, IloscMiejsc)

I teraz ilość zarezerwowanych miejsc na daną trasę to:

SELECT SUM(IloscMiejsc) FROM rezerwacje WHERE TrasaId=x

Ilość wszystkich miejsc miejsc:

SELECT IloscMiejsc FROM trasy WHERE id=x

Wolne miejsca można uzyskać na dwa sposoby. Odjąć powyższe wyniki jeśli przechowyjemny w tabeli TRASY ilość wszystkich miejsc albo przechowywać tam ilość wolnych miejsc, ale wymaga to aktualizowania tabeli zawsze, gdy aktualizujemy tabelę REZERWACJE

0

Przedrostki "podpatrzyłem" w jednej sporej bazie z która mam na co dzień doczynienia i wydają mi się dość wygodne ponieważ wpisując np. tr_ - mam podpowiedź pól w tej tabeli (nie upieram się że to poprawne, ale dla mnie wygodne ;) ).

A z SUM oczywiście masz rację, mój błąd (w przypadku braku pola IloscMiejsc powinno być COUNT tak jak napisałeś).

0

Witam, uprzejmie dziękuje za wszystkie rady. Powiem może jeszcze jak widzę działanie tej aplikacji. Mianowicie klient na stronie głównej w formularzu podaje dane osobowe, wybiera datę i z tabeli MIEJSCA wybiera z listy nazwę miejscowości, skąd chcę wyjechać i gdzie chcę dojechać. Tabela ta jest odrębna chodzi tylko o to, żeby przechowywać informację o miejscach. Tutaj np. operacja CRUD kolejnych miejsc.
Admin się loguje i robi zapytanie. Pokaż mi wszystkich pasażerów, którzy jądą z np. Kraków - Warszawa - dnia 10.10.2015. Generowana jest wtedy lista pasażerów i np. funkcja eksport do PDF.

Albo inaczej tabela łącząca PODROZE_PASAZEROWIE wtedy relacja ManyToMany w Hibernate . Zmieniłem nazwę tabeli Trasy na Podróże bo Podróż może przechowywać informację o dacie wyjazdu, ilości miejsc id. Trasa raczej nie - chyba, nie wiem czy jest to logiczne. Data przyjazdu jest mi niepotrzebna więc usunąłem tą kolumnę.

 
PODROZE (Id, DataOdjazd, MiejsceOdjazd, MiejscePrzyjazd ,IloscMiejsc)
PASAZEROWIE (Id, Imie, Nazwisko, Telefon)
PODROZE_PASAZEROWIE (PordrozId, PasazerId)
MIEJSCA(Id, Nazwa)

Czy teraz ma to sens ?

Dziękuję.

0

Tak, ma to sens.

1 użytkowników online, w tym zalogowanych: 0, gości: 1