DatabaseCreation: ddl.sql

File ddl.sql, 10.8 KB (added by 231003, 13 days ago)
Line 
1CREATE TYPE bus_status AS ENUM ('Active', 'Inactive', 'Under_maintenance');
2CREATE TYPE fuel_type AS ENUM ('Diesel', 'Petrol', 'Electric');
3CREATE TYPE employee_status AS ENUM ('Active', 'Inactive');
4CREATE TYPE customer_type AS ENUM ('Regular', 'Student', 'Retiree');
5CREATE TYPE payment_status AS ENUM ('Pending', 'Completed', 'Failed');
6
7CREATE TABLE Bus
8(
9 bus_id BIGSERIAL NOT NULL,
10 brand varchar(255),
11 PRIMARY KEY (bus_id)
12);
13
14CREATE TABLE Bus_instance
15(
16 chassis_number varchar(255) NOT NULL,
17 bus_id int8 NOT NULL,
18 capacity int4,
19 model varchar(255),
20 registration_number varchar(255) UNIQUE,
21 date_of_manufacture date,
22 fuel_type fuel_type,
23 status bus_status,
24 PRIMARY KEY (chassis_number),
25 CONSTRAINT bus_instance_bus_fk
26 FOREIGN KEY (bus_id) REFERENCES Bus (bus_id)
27 ON DELETE RESTRICT
28 ON UPDATE CASCADE,
29 CONSTRAINT check_capacity
30 CHECK (capacity BETWEEN 25 AND 80)
31);
32
33CREATE TABLE ApplicationUser
34(
35 user_id BIGSERIAL NOT NULL,
36 name varchar(255),
37 surname varchar(255),
38 email varchar(255),
39 address varchar(255) UNIQUE,
40 date_of_birth date,
41 phone_number varchar(255) UNIQUE,
42 id_card varchar(255) UNIQUE,
43 PRIMARY KEY (user_id),
44 CONSTRAINT check_email_format
45 CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'),
46 CONSTRAINT check_phone_format
47 CHECK (phone_number ~ '^(\+389|0)[0-9]{7,9}$'),
48 CONSTRAINT check_date_birth
49 CHECK (date_of_birth <= CURRENT_DATE - INTERVAL '14 years')
50);
51
52CREATE TABLE Admin
53(
54 user_id int8 NOT NULL,
55 verification_code varchar(255) UNIQUE,
56 employment_date date,
57 status employee_status,
58 PRIMARY KEY (user_id),
59 CONSTRAINT admin_user_fk
60 FOREIGN KEY (user_id) REFERENCES ApplicationUser (user_id)
61 ON DELETE CASCADE
62 ON UPDATE CASCADE
63);
64
65CREATE TABLE Driver
66(
67 user_id int8 NOT NULL,
68 driver_license varchar(255) UNIQUE,
69 employment_date date,
70 status employee_status,
71 verification_code varchar(255) UNIQUE,
72 PRIMARY KEY (user_id),
73 CONSTRAINT driver_user_fk
74 FOREIGN KEY (user_id) REFERENCES ApplicationUser (user_id)
75 ON DELETE CASCADE
76 ON UPDATE CASCADE
77
78);
79
80CREATE TABLE Conductor
81(
82 user_id int8 NOT NULL,
83 employment_date date,
84 status employee_status,
85 verification_code varchar(255) UNIQUE,
86 PRIMARY KEY (user_id),
87 CONSTRAINT conductor_user_fk
88 FOREIGN KEY (user_id) REFERENCES ApplicationUser (user_id)
89 ON DELETE CASCADE
90 ON UPDATE CASCADE
91);
92
93CREATE TABLE Customer
94(
95 user_id int8 NOT NULL,
96 type customer_type,
97 PRIMARY KEY (user_id),
98 CONSTRAINT customer_user_fk
99 FOREIGN KEY (user_id) REFERENCES ApplicationUser (user_id)
100 ON DELETE CASCADE
101 ON UPDATE CASCADE
102);
103
104CREATE TABLE Maintenance
105(
106 maintenance_id BIGSERIAL NOT NULL,
107 chassis_number varchar(255) UNIQUE,
108 maintenance_date date,
109 description varchar(255),
110 cost int4,
111 maintenance_name varchar(255),
112 PRIMARY KEY (maintenance_id),
113 CONSTRAINT maintenance_bus_instance_fk
114 FOREIGN KEY (chassis_number) REFERENCES Bus_instance (chassis_number)
115 ON DELETE RESTRICT
116 ON UPDATE CASCADE,
117 CONSTRAINT check_cost
118 CHECK (cost > 0)
119);
120
121CREATE TABLE Maintainer
122(
123 user_id int8 NOT NULL,
124 employment_date date,
125 status employee_status,
126 maintenance_id int8,
127 verification_code varchar(255) UNIQUE,
128 PRIMARY KEY (user_id),
129 CONSTRAINT maintainer_user_fk
130 FOREIGN KEY (user_id) REFERENCES ApplicationUser (user_id)
131 ON DELETE CASCADE
132 ON UPDATE CASCADE,
133 CONSTRAINT maintainer_maintenance_fk
134 FOREIGN KEY (maintenance_id) REFERENCES Maintenance (maintenance_id)
135 ON DELETE RESTRICT
136 ON UPDATE CASCADE
137);
138
139CREATE TABLE Station
140(
141 station_id SERIAL NOT NULL,
142 ordinal_number int4,
143 station_name varchar(255) UNIQUE,
144 address varchar(255),
145 PRIMARY KEY (station_id)
146);
147
148CREATE TABLE Line
149(
150 line_id SERIAL NOT NULL,
151 start_station_id int4 NOT NULL,
152 end_station_id int4 NOT NULL,
153 line_number int4,
154 is_active bool,
155 PRIMARY KEY (line_id),
156 CONSTRAINT line_start_station_fk
157 FOREIGN KEY (start_station_id) REFERENCES Station (station_id)
158 ON DELETE RESTRICT
159 ON UPDATE CASCADE,
160 CONSTRAINT line_end_station_fk
161 FOREIGN KEY (end_station_id) REFERENCES Station (station_id)
162 ON DELETE RESTRICT
163 ON UPDATE CASCADE
164);
165
166CREATE TABLE Schedule
167(
168 schedule_id SERIAL NOT NULL,
169 line_id int4 NOT NULL,
170 departure_time time,
171 arrival_time time,
172 day_of_week varchar(255),
173 PRIMARY KEY (schedule_id),
174 CONSTRAINT schedule_line_fk
175 FOREIGN KEY (line_id) REFERENCES Line (line_id)
176 ON DELETE CASCADE
177 ON UPDATE CASCADE,
178 CONSTRAINT check_schedule_time
179 CHECK (departure_time < arrival_time),
180 CONSTRAINT check_day_of_week
181 CHECK (day_of_week IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'))
182);
183
184CREATE TABLE Position
185(
186 station_id int4 NOT NULL,
187 line_id int4 NOT NULL,
188 num_of_station int4 NOT NULL,
189 PRIMARY KEY (station_id, line_id, num_of_station),
190 CONSTRAINT position_station_fk
191 FOREIGN KEY (station_id) REFERENCES Station (station_id)
192 ON DELETE CASCADE
193 ON UPDATE CASCADE,
194 CONSTRAINT position_line_fk
195 FOREIGN KEY (line_id) REFERENCES Line (line_id)
196 ON DELETE CASCADE
197 ON UPDATE CASCADE
198);
199
200CREATE TABLE Payment_type
201(
202 type_id BIGSERIAL NOT NULL,
203 type varchar(255),
204 description varchar(255),
205 PRIMARY KEY (type_id)
206);
207
208CREATE TABLE Payment
209(
210 payment_id BIGSERIAL NOT NULL,
211 type_id int8 NOT NULL,
212 status payment_status,
213 payment_date date,
214 transaction_number varchar(255),
215 PRIMARY KEY (payment_id),
216 CONSTRAINT payment_type_fk
217 FOREIGN KEY (type_id) REFERENCES Payment_type (type_id)
218 ON DELETE RESTRICT
219 ON UPDATE CASCADE
220);
221
222CREATE TABLE Pass_type
223(
224 id SERIAL NOT NULL,
225 type varchar(255) NOT NULL,
226 valid_from date,
227 valid_until date,
228 amount int4,
229 PRIMARY KEY (id),
230 CONSTRAINT check_pass_type_time
231 CHECK (valid_from < valid_until),
232 CONSTRAINT check_price
233 CHECK (amount > 0)
234);
235
236CREATE TABLE Ticket
237(
238 ticket_id BIGSERIAL NOT NULL,
239 user_id int8 NOT NULL,
240 PRIMARY KEY (ticket_id),
241 CONSTRAINT ticket_user_fk
242 FOREIGN KEY (user_id) REFERENCES Customer (user_id)
243 ON DELETE RESTRICT
244 ON UPDATE CASCADE
245);
246
247CREATE TABLE Line_assignment
248(
249 assignment_id BIGSERIAL NOT NULL,
250 driver_id int8 NOT NULL,
251 admin_id int8 NOT NULL,
252 chassis_number varchar(255) NOT NULL,
253 schedule_id int4 NOT NULL,
254 start_time timestamp,
255 end_time timestamp,
256 PRIMARY KEY (assignment_id),
257 CONSTRAINT line_assignment_driver_fk
258 FOREIGN KEY (driver_id) REFERENCES Driver (user_id)
259 ON DELETE RESTRICT
260 ON UPDATE CASCADE,
261 CONSTRAINT line_assignment_admin_fk
262 FOREIGN KEY (admin_id) REFERENCES Admin (user_id)
263 ON DELETE RESTRICT
264 ON UPDATE CASCADE,
265 CONSTRAINT line_assignment_bus_instance_fk
266 FOREIGN KEY (chassis_number) REFERENCES Bus_instance (chassis_number)
267 ON DELETE RESTRICT
268 ON UPDATE CASCADE,
269 CONSTRAINT line_assignment_schedule_fk
270 FOREIGN KEY (schedule_id) REFERENCES Schedule (schedule_id)
271 ON DELETE RESTRICT
272 ON UPDATE CASCADE,
273 CONSTRAINT check_time
274 CHECK (start_time < end_time),
275 CONSTRAINT unique_driver_shift
276 UNIQUE (driver_id, start_time, end_time)
277);
278
279CREATE TABLE Single_ticket
280(
281 ticket_id int8 NOT NULL,
282 amount int4,
283 assignment_id int8 NOT NULL,
284 PRIMARY KEY (ticket_id),
285 CONSTRAINT single_ticket_ticket_fk
286 FOREIGN KEY (ticket_id) REFERENCES Ticket (ticket_id)
287 ON DELETE CASCADE
288 ON UPDATE CASCADE,
289 CONSTRAINT single_ticket_assignment_fk
290 FOREIGN KEY (assignment_id) REFERENCES Line_assignment (assignment_id)
291 ON DELETE RESTRICT
292 ON UPDATE CASCADE,
293 CONSTRAINT check_single_ticket_price
294 CHECK (amount = 50)
295);
296
297CREATE TABLE Pass_ticket
298(
299 ticket_id int8 NOT NULL,
300 type_id int4 NOT NULL,
301 PRIMARY KEY (ticket_id),
302 CONSTRAINT pass_ticket_ticket_fk
303 FOREIGN KEY (ticket_id) REFERENCES Ticket (ticket_id)
304 ON DELETE CASCADE
305 ON UPDATE CASCADE,
306 CONSTRAINT pass_ticket_pass_type_fk
307 FOREIGN KEY (type_id) REFERENCES Pass_type (id)
308 ON DELETE RESTRICT
309 ON UPDATE CASCADE
310);
311
312CREATE TABLE Customer_Payment_Ticket
313(
314 payment_id int8 NOT NULL,
315 ticket_id int8 NOT NULL,
316 user_id int8 NOT NULL,
317 PRIMARY KEY (payment_id, ticket_id, user_id),
318 CONSTRAINT cpt_payment_fk
319 FOREIGN KEY (payment_id) REFERENCES Payment (payment_id)
320 ON DELETE RESTRICT
321 ON UPDATE CASCADE,
322 CONSTRAINT cpt_ticket_fk
323 FOREIGN KEY (ticket_id) REFERENCES Ticket (ticket_id)
324 ON DELETE RESTRICT
325 ON UPDATE CASCADE,
326 CONSTRAINT cpt_customer_fk
327 FOREIGN KEY (user_id) REFERENCES Customer (user_id)
328 ON DELETE RESTRICT
329 ON UPDATE CASCADE
330);
331
332CREATE TABLE Validation
333(
334 validation_id BIGSERIAL NOT NULL,
335 conductor_id int8 NOT NULL,
336 ticket_id int8 NOT NULL,
337 assignment_id int8 NOT NULL,
338 validation_time timestamp,
339 PRIMARY KEY (validation_id),
340 CONSTRAINT conductor_fk
341 FOREIGN KEY (conductor_id) REFERENCES Conductor (user_id)
342 ON DELETE RESTRICT
343 ON UPDATE CASCADE,
344 CONSTRAINT ticket_id
345 FOREIGN KEY (ticket_id) REFERENCES Ticket (ticket_id)
346 ON DELETE RESTRICT
347 ON UPDATE CASCADE,
348 CONSTRAINT assignment_id
349 FOREIGN KEY (assignment_id) REFERENCES Line_assignment (assignment_id)
350 ON DELETE CASCADE
351 ON UPDATE CASCADE
352);