Pytania na początek:
1. Czy liczy się dla nas customer service czy mamy ich
* Jeżeli tak, to mamy też bazę klijentów zarejstrowanych z przypisanymi biletami.
* W takim wypadku czy jesteśmy też tak fajni jak koleje śląskie?
* Jeżeli tak, to mamy też ludzi bez id ale z możliwością zakupu biletu.
* Jeżeli nie, to biety kupuje się telefonicznie i nasz pracownik wprowadza dane do bazy.
2. Czy kupione bilety na miejscu też wprowadzamy do systemu?
3. Czy Rejsy wynajęte są po trasach ustalonych przez firmę czy przez klijenta?
4. Do jakiego okresu w przyszłość udostępniamy możlowisć bookingu rejsu?
5. Co ile publikujemy nowy rozkład?
---
- [x] Mamy więc rejsy wg rozkładu po ustalonych trasach.
- [x] Mamy taksówki z ustaloną liczbą miejsc i informacją o desęności oraz sprawności.
- [x] Mamy bilety kupione z wyprzedzeniem i na miejscu.
- [x] Mamy rejsy prywatne otwarte i zamknięte.
- [x] Mamy uzytkowników, którzy mogą kupić bilet bez dodatkowego wypełniania danych oraz takich którzy mogą być niezalogowani z koniecznością wprowadzenia danych
1. Mamy wyspy z rozróżnialnymi identyfikatorami;
2. Mamy taksówki z rozróżnialnymi identyfikatorami;
3. Mamy połączenia między wyspami;
4. Z conajmniej 1 połączenia tworzymy trasę
5. Na każdą trasę przypada rejs
6. Na każdy rejs przypada sprawna taksówka
7. Na każdy rejs przypada n biletów, n = liczba miejsc
8. Rejsy rozkładowe przechowujemy w rejsach
9. Rejsy prywatne przechowujemy w rejsach
Proponuję zatem tabele:
|Taksówka| | | |
|:------:|:--:|:--:|:--:|
|id_taksowki<br/>int|liczba_miejsc<br/>int|czy_sprawna<br/>bit|czy_dostępna<br/>bit|
|Wyspa| |
|:---:|:--:|
|id_wyspy<br/>int|nazwa_wyspy<br/>text|
|Polaczenie| | | | |
|:--------:|:--:|:--:|:--:|:--:|
|id_polaczenia<br/>int|wyspa_A<br/>int|wyspa_B<br/>int|czas_przebycia<br/>timestamp|odleglosc_pomiedzy<br/>decimal|
|Trasa | | |
|:------:|:--:|:--:|
|id_trasy<br/>int|id_polaczenia<br/>int|nr_porzadkowy_polaczenia_w_trasie<br/>int|
Połączenia o wspólnym id_trasy tworzą trasę
|Rejs | | | | | | |
|:---:|:--:|:--:|:--:|:--:|:--:|:--:|
|id_rejsu<br/>int|id_trasy<br/>int|id_taksowki<br/>int|data_godzina_wypłynięcia<br/>timestamp|liczba_dostępnych_miejsc<br/>int|publiczny<br/>bit|otwarty<br/>bit|
Jeżeli jest publiczny to zawsze jest otwarty
Jeżeli jest prywatny to może być otwarty - 1 z możliwością dołączenia lub zamknięty - 0
Liczba_dostępnych_miejsc = Taksówka.liczba_miejsc-sum(Bilet.liczba_osob)
|Bilet | | | | | | | |
|:-------:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|id_biletu<br/>int|id_rejsu<br/>int|imię_nazwisko<br/>text|liczba_osob<br/>int|wyspa_poczatkowa<br/>int|wyspa_koncowa<br/>int|cena<br/>decimal|czy_prywatny<br/>bit|
|Uzytkownik | | | |
|:------------:|:--:|:--:|:--:|
|id_uzytkownika<br/>int|imię_nazwisko<br/>text|email<br/>text|pass<br/>text|
* może jeszcze chcemy?
|Historia_urzytkownika| | |
|:-------------------:|:--:|:--:|
|id_uzytkownika<br/>int|id_trasy<br/>int|id_biletu<br/>int|
---
#### Diagram E-R
```graphviz digraph summary
digraph ER{
nodesep=0.5
# ranksep = 9;
label="Diagram E-R"
edge[arrowhead=no]
node[shape=ellipse];
# sets of entities
Taksowka[shape=box];
Wyspa[shape=box];
Polaczenie[style=dashed shape=box];
Trasa[style=dashed shape=box];
Rejs[style=dashed shape=box];
Bilet[shape=box];
Uzytkownik[shape=box];
# attributes of Taksówka
TaxId[label=<<u>id_taksowki</u>>]
TaxSeats[label="liczba_miejsc,\n int"]
TaxOK[label="sprawna,\nbit,\nNOT NULL"]
TaxAvailable[label="dostępna,\nbit,\n NOT NULL"]
TaxId->Taksowka
TaxSeats->Taksowka
TaxOK->Taksowka
TaxAvailable->Taksowka
# attributes of Wyspa
IslID[label=<<u>id_wyspy</u>>]
IslName[label="nazwa_wyspy,\n text,\n NOT NULL"]
IslID->Wyspa;
IslName->Wyspa
# attributes of Polaczenie
ConId[label=<<u>id_polaczenia</u>>]
ConIslA[label="wyspa_A,\n NOT NULL"]
ConIslB[label="wyspa_B,\n NOT NULL"]
ConTime[label="czas_przebycia\ntimestamp\nNOT NULL"]
ConDist[label="odleglosc_pomiedzy\ndecimal\nNOT NULL"]
ConId->Polaczenie
ConIslA->Polaczenie
ConIslB->Polaczenie
ConTime->Polaczenie
ConDist->Polaczenie
# attributes of Trasa
RouteId[label=<<u>id_trasy</u>> peripheries=2]
RouteConId[label="id_polaczenia\nint\nNOT NULL"]
RouteConSerial[label="nr_porzadkowy_polaczenia_w_trasie\nint\nNOT NULL" peripheries=2]
RouteId->Trasa
RouteConId->Trasa
RouteConSerial->Trasa
# attributes of Rejs
CruId[label=<<u>id_rejsu</u>>]
CruRouteId[label="id_trasy,\nint,\nNOT NULL"]
CruTaxId[label="id_taksowki,\nint,\nNOT NULL"]
CruDepTime[label="data_godzina_wypłynięcia\ntimestamp,\nNOT NULL"]
CruSeats[style=dashed label="liczba_dostępnych_miejsc,\nint,\nNOT NULL"]
CruPub[label="publiczny,\nbit\nNOT NULL"]
CruOpen[label="otwarty,\nbit\nNOT NULL"]
CruId->Rejs
CruRouteId->Rejs
CruTaxId->Rejs
CruDepTime->Rejs
CruSeats->Rejs
CruPub->Rejs
CruOpen->Rejs
# attributes of Bilet
TickId[label=<<u>id_biletu</u>>]
TickCruId[style=dashed label="id_rejsu,\nint,\nNOT NULL"]
TickName[label="imię_nazwisko,\ntext,\nNOT NULL"]
TickSeats[label="liczba_osob,\nint,\nNOT NULL"]
TickIslA[label="wyspa_poczatkowa,\nint,\nNOT NULL"]
TickIslB[label="wyspa_koncowa,\nint,\nNOT NULL"]
TickPrice[style=dashed label="cena,\ndecimal,\nNOT NULL"]
TicketIsCruPrivate[label="prywatny_rejs,\nbit,\nNOT NULL"]
TickId->Bilet
TickCruId->Bilet
TickName->Bilet
TickSeats->Bilet
TickIslA->Bilet
TickIslB->Bilet
TickPrice->Bilet
TicketIsCruPrivate->Bilet
# attributes of Uzytkownik
UID[label=<<u>id_uzytkownika</u>>]
Name[label="Imie i nazwisko,\ntext,\nNOT NULL"]
Email[label="email,\ntext,\nNOT NULL"]
Pass[label="password,\ntext,\nNOT NULL"]
UID->Uzytkownik
Name->Uzytkownik
Email->Uzytkownik
Pass->Uzytkownik
Has[shape=diamond label="Ma"];
ConsistsOf[shape=diamond label="Składa się na"];
Has1[style=dashed shape=diamond label="Składa się na"];
IsOn1[style=dashed shape=diamond label="Jest Na"];
Has2[shape=diamond label="Ma"];
IsOn2[style=dashed shape=diamond label="Jest Na"];
Wyspa->Has[dir=back,arrowhead=normal]
Has->Polaczenie[arrowhead=normal]
Polaczenie->ConsistsOf[penwidth=3.0]
ConsistsOf->Trasa[penwidth=3.0,arrowhead=normal]
Trasa->Has1[penwidth=3.0]
Has1->Rejs[penwidth=3.0,arrowhead=normal]
Uzytkownik->Has2
Has2->Bilet[arrowhead=normal]
Bilet->IsOn1[penwidth=3.0]
IsOn1->Rejs[penwidth=3.0,arrowhead=normal]
Taksowka -> IsOn2[penwidth=3.0,arrowhead=normal,dir=back]
IsOn2 -> Rejs[penwidth=3.0]
}
```