-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcreate_db.sql
More file actions
148 lines (137 loc) · 4.19 KB
/
create_db.sql
File metadata and controls
148 lines (137 loc) · 4.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
DROP DATABASE IF EXISTS bus_booking;
CREATE DATABASE bus_booking;
USE bus_booking;
CREATE TABLE drivers (
id INT NOT NULL AUTO_INCREMENT,
surname varchar(64) NOT NULL,
name varchar(64) NOT NULL,
patronymic varchar(64) NOT NULL,
phone varchar(16) NOT NULL,
email varchar(64) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE cities (
id INT NOT NULL AUTO_INCREMENT,
name varchar(64) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE bus_models (
id INT NOT NULL AUTO_INCREMENT,
name varchar(256) NOT NULL,
seats_number SMALLINT NOT NULL,
CHECK(seats_number > 0),
PRIMARY KEY (id)
);
CREATE TABLE buses (
id INT NOT NULL AUTO_INCREMENT,
model_id INT NOT NULL,
color varchar(16),
licence_plate_number varchar(16),
PRIMARY KEY (id),
FOREIGN KEY (model_id) REFERENCES bus_models(id)
);
CREATE TABLE routes (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
);
CREATE TABLE journeys (
id INT NOT NULL AUTO_INCREMENT,
route_id INT NOT NULL,
bus_id INT NOT NULL,
driver_id INT NOT NULL,
start_date DATE NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (route_id) REFERENCES routes(id),
FOREIGN KEY (bus_id) REFERENCES buses(id),
FOREIGN KEY (driver_id) REFERENCES drivers(id)
);
CREATE TABLE stops (
id INT NOT NULL AUTO_INCREMENT,
route_id INT NOT NULL,
city_id INT NOT NULL,
day_shift INT NOT NULL,
time TIME NOT NULL,
price INT NOT NULL,
CHECK(price >= 0),
PRIMARY KEY (id, route_id),
FOREIGN KEY (route_id) REFERENCES routes(id) ON DELETE CASCADE,
FOREIGN KEY (city_id) REFERENCES cities(id)
);
CREATE TABLE tickets (
id INT NOT NULL AUTO_INCREMENT,
surname varchar(64) NOT NULL,
name varchar(64) NOT NULL,
phone varchar(32) NOT NULL,
email varchar(64) NOT NULL,
journey_id INT NOT NULL,
seat_number INT NOT NULL,
stop_number_from INT NOT NULL,
CHECK(stop_number_from > 0),
stop_number_to INT NOT NULL,
price INT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT now(),
CHECK(price > 0),
CHECK(stop_number_to > 0),
PRIMARY KEY (id),
FOREIGN KEY (journey_id) REFERENCES journeys(id),
FOREIGN KEY (stop_number_from) REFERENCES stops(id),
FOREIGN KEY (stop_number_to) REFERENCES stops(id)
);
CREATE VIEW journey_stops AS
SELECT
journeys.id AS journey_id,
stops.id AS stop_id,
stops.price AS price,
cities.name AS city_name,
TIMESTAMP(start_date + INTERVAL day_shift DAY, time) AS timestamp
FROM journeys
JOIN routes ON journeys.route_id = routes.id
JOIN stops ON routes.id = stops.route_id
JOIN cities ON city_id = cities.id
ORDER BY journey_id, timestamp;
CREATE VIEW trips AS
SELECT * FROM (
SELECT
journey_stops_from.journey_id AS journey_id,
from_stop_id,
to_stop_id,
from_city_name,
to_city_name,
from_timestamp,
to_timestamp
FROM (
SELECT
journey_id,
stop_id as from_stop_id,
city_name AS from_city_name,
timestamp AS from_timestamp
FROM
journey_stops
) AS journey_stops_from JOIN (
SELECT
journey_id,
stop_id AS to_stop_id,
city_name AS to_city_name,
timestamp AS to_timestamp
FROM
journey_stops
)
AS journey_stops_to
ON journey_stops_from.journey_id = journey_stops_to.journey_id
) AS unfiltered WHERE from_timestamp < to_timestamp;
CREATE VIEW journey_seats AS
SELECT
tickets.id AS ticket_id,
journey_stops_from.journey_id,
journey_stops_from.timestamp AS timestamp_from,
journey_stops_to.timestamp AS timestamp_to,
seat_number
FROM tickets
JOIN journey_stops
AS journey_stops_from
ON tickets.journey_id = journey_stops_from.journey_id AND
tickets.stop_number_from = journey_stops_from.stop_id
JOIN journey_stops
AS journey_stops_to
ON tickets.journey_id = journey_stops_from.journey_id AND
tickets.stop_number_to = journey_stops_to.stop_id;