DatabaseCreation: ddl.sql

File ddl.sql, 11.0 KB (added by 231109, 2 weeks ago)
Line 
1CREATE TABLE Company (
2 company_id SERIAL,
3 name VARCHAR(100) NOT NULL UNIQUE,
4 contact_info VARCHAR(255) NOT NULL,
5 PRIMARY KEY (company_id),
6 CONSTRAINT check_name_length CHECK (char_length(trim(name)) >= 2)
7);
8CREATE TABLE Person (
9 EMBG CHAR(13) NOT NULL DEFAULT '0000000000000',
10 first_name VARCHAR(20) NOT NULL DEFAULT 'Unknown',
11 last_name VARCHAR(20) NOT NULL DEFAULT 'Unknown',
12 gender CHAR(1) NOT NULL DEFAULT 'O',
13 nationality VARCHAR(20) NOT NULL DEFAULT 'Unknown',
14 phone_number VARCHAR(20) NOT NULL DEFAULT '+00000000000',
15 email VARCHAR(40) NOT NULL DEFAULT 'example@email.com',
16 PRIMARY KEY (EMBG),
17 CONSTRAINT check_email_format
18 CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$'),
19 CONSTRAINT check_phone_format
20 CHECK (phone_number ~ '^\+?[0-9]{7,15}$'),
21 CONSTRAINT check_gender
22 CHECK (gender IN ('M', 'F', 'O'))
23);
24
25CREATE TABLE Employee (
26 PersonEMBG CHAR(13) NOT NULL,
27 employee_id SERIAL,
28 position VARCHAR(20) NOT NULL,
29 Companycompany_id int4 NOT NULL,
30 PRIMARY KEY (PersonEMBG, employee_id),
31 CONSTRAINT check_embg_numeric CHECK (PersonEMBG ~ '^[0-9]{13}$'),
32 CONSTRAINT check_employee_id_positive CHECK (employee_id > 0),
33 CONSTRAINT chk_position
34 CHECK (position IN ('TrainDriver','AssistantDriver','Conductor','SignalOperator','MaintenanceWorker','StationMaster','Chef','Waiter','Cashier')),
35 CONSTRAINT generalization FOREIGN KEY (PersonEMBG) REFERENCES Person (EMBG) ON DELETE RESTRICT,
36 CONSTRAINT has FOREIGN KEY (Companycompany_id) REFERENCES Company (company_id) ON DELETE RESTRICT
37);
38
39CREATE TABLE "Employee_operates_Train Service" (
40 Employeeemployee_id int4 NOT NULL,
41 EmployeePersonEMBG2 CHAR(13) NOT NULL,
42 PRIMARY KEY (Employeeemployee_id, EmployeePersonEMBG2),
43 CONSTRAINT FKEmployee_o94327 FOREIGN KEY (EmployeePersonEMBG2, Employeeemployee_id) REFERENCES Employee (PersonEMBG, employee_id)
44);
45
46CREATE TABLE Segment (
47 segment_id SERIAL NOT NULL,
48 length_km NUMERIC(2, 0),
49 type VARCHAR(20),
50 max_speed int4,
51 status VARCHAR(20),
52 Stationstation_id3 int4 NOT NULL,
53 PRIMARY KEY (segment_id)
54);
55
56CREATE TABLE Station (
57 station_id SERIAL NOT NULL,
58 station_name VARCHAR(20),
59 country VARCHAR(40),
60 city VARCHAR(20),
61 address VARCHAR(40),
62 PRIMARY KEY (station_id)
63);
64
65
66CREATE TABLE Maintenance (
67 maintenance_id SERIAL,
68 maintenance_date date NOT NULL,
69 description VARCHAR(1000) NOT NULL,
70 Stationstation_id int4 NOT NULL,
71 Segmentsegment_id int4 NOT NULL,
72 PRIMARY KEY (maintenance_id),
73 CONSTRAINT check_maintenance_date CHECK (maintenance_date > '2000-01-01'),
74 CONSTRAINT at FOREIGN KEY (Stationstation_id) REFERENCES Station (station_id),
75 CONSTRAINT undergoes FOREIGN KEY (Segmentsegment_id) REFERENCES Segment (segment_id)
76);
77CREATE TABLE Employee_performs_Maintenance (
78 Employeeemployee_id int4 NOT NULL,
79 Maintenancemaintenance_id int4 NOT NULL,
80 EmployeePersonEMBG2 CHAR(13) NOT NULL,
81 PRIMARY KEY (
82 Employeeemployee_id,
83 Maintenancemaintenance_id,
84 EmployeePersonEMBG2
85 ),
86 CONSTRAINT FKEmployee_p144416 FOREIGN KEY (Maintenancemaintenance_id) REFERENCES Maintenance (maintenance_id),
87 CONSTRAINT FKEmployee_p884220 FOREIGN KEY (EmployeePersonEMBG2, Employeeemployee_id) REFERENCES Employee (PersonEMBG, employee_id)
88
89);
90
91
92CREATE TABLE Passenger (
93 PersonEMBG CHAR(13) NOT NULL,
94 passenger_id int4 NOT NULL,
95 PRIMARY KEY (PersonEMBG, passenger_id),
96 CONSTRAINT check_passenger_embg_format CHECK (PersonEMBG ~ '^[0-9]{13}$'),
97 CONSTRAINT check_passenger_id_positive CHECK (passenger_id > 0),
98 CONSTRAINT "generalization " FOREIGN KEY (PersonEMBG) REFERENCES Person (EMBG) ON DELETE RESTRICT
99);
100CREATE TABLE Reservation (
101 reservation_id SERIAL NOT NULL,
102 status VARCHAR(20),
103 expiry_time date,
104 Passengerpassenger_id int4 NOT NULL,
105 PassengerPersonEMBG2 CHAR(13) NOT NULL,
106 PRIMARY KEY (reservation_id),
107 CONSTRAINT pass_makes FOREIGN KEY (PassengerPersonEMBG2, Passengerpassenger_id) REFERENCES Passenger (PersonEMBG, passenger_id)
108);
109
110CREATE TABLE Payment (
111 payment_id SERIAL,
112 payment_method VARCHAR(20) ,
113 amount NUMERIC(2, 0),
114 transaction_date date,
115 Reservationreservation_id int4 NOT NULL,
116 Passengerpassenger_id int4 NOT NULL,
117 PassengerPersonEMBG2 CHAR(13) NOT NULL,
118 PRIMARY KEY (payment_id),
119 CONSTRAINT makes FOREIGN KEY (PassengerPersonEMBG2, Passengerpassenger_id) REFERENCES Passenger (PersonEMBG, passenger_id),
120CONSTRAINT paid_by FOREIGN KEY (Reservationreservation_id) REFERENCES Reservation (reservation_id) ON DELETE CASCADE
121 -- A payment record is tied to a specific reservation; if the reservation is purged, the payment link goes too.
122);
123
124
125
126CREATE TABLE Platform (
127 Stationstation_id int4 NOT NULL,
128 platform_id int4 NOT NULL,
129 platform_number int4,
130 PRIMARY KEY (Stationstation_id, platform_id),
131 CONSTRAINT station_has FOREIGN KEY (Stationstation_id) REFERENCES Station (station_id) ON DELETE RESTRICT
132);
133
134
135
136CREATE TABLE Route (
137 route_id SERIAL NOT NULL,
138 route_name VARCHAR(20),
139 type int4,
140 PRIMARY KEY (route_id)
141);
142
143CREATE TABLE Route_Segment (
144 Routeroute_id int4 NOT NULL,
145 Segmentsegment_id int4 NOT NULL,
146 sequence_number int4 NOT NULL,
147 stops_at_segment int4 DEFAULT NULL,
148 is_station_stop int2 DEFAULT 0,
149 Stationstation_id int4,
150 distance_from_start float4,
151 estimated_time_offset int4,
152 PRIMARY KEY (Routeroute_id, Segmentsegment_id),
153CONSTRAINT FKRoute_Segm456953 FOREIGN KEY (Stationstation_id) REFERENCES Station (station_id),
154 CONSTRAINT FKRoute_Segm742581 FOREIGN KEY (Segmentsegment_id) REFERENCES Segment (segment_id),
155 CONSTRAINT FKRoute_Segm866494 FOREIGN KEY (Routeroute_id) REFERENCES Route (route_id) ON DELETE CASCADE ,
156 -- If a Route is deleted, all its segment mappings are automatically removed.
157 CONSTRAINT is_located_on FOREIGN KEY (Stationstation_id) REFERENCES Station (station_id) ON DELETE RESTRICT
158
159);
160
161
162CREATE TABLE Train (
163 train_id SERIAL NOT NULL,
164 train_number int4,
165 type VARCHAR(20),
166 manufacture_year CHAR(4),
167 capacity int4,
168 max_speed int4,
169 Companycompany_id int4 NOT NULL,
170 Routeroute_id int4 NOT NULL,
171 PRIMARY KEY (train_id),
172 CONSTRAINT "operates on" FOREIGN KEY (Routeroute_id) REFERENCES Route (route_id) ON DELETE SET NULL,
173CONSTRAINT owns FOREIGN KEY (Companycompany_id) REFERENCES Company (company_id) ON DELETE RESTRICT
174);
175
176
177CREATE TABLE Schedule (
178 schedule_id SERIAL NOT NULL,
179 day_of_week CHAR(1),
180 departure_time date,
181 arrival_time date,
182 status VARCHAR(20),
183 Routeroute_id int4 NOT NULL,
184 Traintrain_id int4 NOT NULL,
185 PRIMARY KEY (schedule_id),
186 CONSTRAINT "assinged to" FOREIGN KEY (Traintrain_id) REFERENCES Train (train_id),
187 CONSTRAINT follows FOREIGN KEY (Routeroute_id) REFERENCES Route (route_id) ON DELETE SET NULL
188);
189
190
191CREATE TABLE "Train Trip" (
192 trip_id SERIAL NOT NULL,
193 departure_time date,
194 arrival_time date,
195 trip_status VARCHAR(20),
196 delay_minutes int4,
197 Routeroute_id int4 NOT NULL,
198 Traintrain_id int4 NOT NULL,
199 Employeeemployee_id int4 NOT NULL,
200 EmployeePersonEMBG2 CHAR(13) NOT NULL,
201 PlatformStationstation_id int4 NOT NULL,
202 Platformplatform_id int4 NOT NULL,
203 PRIMARY KEY (trip_id),
204 CONSTRAINT assigned FOREIGN KEY (Traintrain_id) REFERENCES Train (train_id),
205 CONSTRAINT drives FOREIGN KEY (EmployeePersonEMBG2, Employeeemployee_id) REFERENCES Employee (PersonEMBG, employee_id),
206
207 CONSTRAINT "stops at" FOREIGN KEY (PlatformStationstation_id, Platformplatform_id) REFERENCES Platform (Stationstation_id, platform_id),
208CONSTRAINT trip_follows FOREIGN KEY (Routeroute_id) REFERENCES Route (route_id)
209);
210
211CREATE TABLE Ticket (
212 ticket_id SERIAL NOT NULL,
213 seat_number int4,
214 carriage_number int4,
215 price NUMERIC(2, 0),
216 ticket_status VARCHAR(20),
217 Paymentpayment_id int4 NOT NULL,
218 "Train Triptrip_id" int4 NOT NULL,
219 Stationstation_id int4 NOT NULL,
220 Stationstation_id2 int4 NOT NULL,
221 PRIMARY KEY (ticket_id),
222 CONSTRAINT ends_at FOREIGN KEY (Stationstation_id2) REFERENCES Station (station_id),
223 CONSTRAINT "for" FOREIGN KEY ("Train Triptrip_id") REFERENCES "Train Trip" (trip_id) ON DELETE SET NULL,
224 CONSTRAINT generates FOREIGN KEY (Paymentpayment_id) REFERENCES Payment (payment_id) ON DELETE CASCADE ,
225 -- If a Payment is deleted, the Ticket is automatically removed because a ticket cannot exist without a valid financial record.
226 CONSTRAINT starts_at FOREIGN KEY (Stationstation_id) REFERENCES Station (station_id)
227);
228
229CREATE TABLE "Train Service" (
230 service_id int4 NOT NULL,
231 service_type VARCHAR(20) NOT NULL,
232 opening_time date NOT NULL,
233 closing_time date NOT NULL,
234 "Train Triptrip_id" int4 NOT NULL,
235 Traintrain_id int4 NOT NULL,
236CONSTRAINT includes FOREIGN KEY ("Train Triptrip_id") REFERENCES "Train Trip" (trip_id),
237CONSTRAINT provides FOREIGN KEY (Traintrain_id) REFERENCES Train (train_id)
238);
239
240
241CREATE TABLE "Train Trip_Segment" (
242 "Train Triptrip_id" int4 NOT NULL,
243 Segmentsegment_id int4 NOT NULL,
244 log_sequence_order int4 NOT NULL,
245 PRIMARY KEY ("Train Triptrip_id", Segmentsegment_id),
246 CONSTRAINT "FKTrain Trip986709" FOREIGN KEY (Segmentsegment_id) REFERENCES Segment (segment_id),
247 CONSTRAINT "FKTrain Trip511043" FOREIGN KEY ("Train Triptrip_id") REFERENCES "Train Trip" (trip_id)
248);
249
250CREATE TABLE train_stops_at_station (
251 Traintrain_id int4 NOT NULL,
252 Stationstation_id int4 NOT NULL,
253 PRIMARY KEY (Traintrain_id, Stationstation_id),
254 CONSTRAINT FKtrain_stop896006 FOREIGN KEY (Stationstation_id) REFERENCES Station (station_id) ON DELETE RESTRICT,
255 CONSTRAINT FKtrain_stop965689 FOREIGN KEY (Traintrain_id) REFERENCES Train (train_id) ON DELETE RESTRICT
256);
257
258CREATE TABLE Train_undergoes_Maintenance (
259 Traintrain_id int4 NOT NULL,
260 Maintenancemaintenance_id int4 NOT NULL,
261 PRIMARY KEY (Traintrain_id, Maintenancemaintenance_id),
262 CONSTRAINT FKTrain_unde536762 FOREIGN KEY (Maintenancemaintenance_id) REFERENCES Maintenance (maintenance_id) ON DELETE RESTRICT
263);
264
265
266
267
268
269DROP TABLE IF EXISTS "Train Trip_Segment" CASCADE;
270
271DROP TABLE IF EXISTS train_stops_at_station CASCADE;
272
273DROP TABLE IF EXISTS Train_undergoes_Maintenance CASCADE;
274
275DROP TABLE IF EXISTS "Employee_operates_Train Service" CASCADE;
276
277DROP TABLE IF EXISTS Employee_performs_Maintenance CASCADE;
278
279DROP TABLE IF EXISTS Route_Segment CASCADE;
280
281DROP TABLE IF EXISTS "Train Service" CASCADE;
282
283DROP TABLE IF EXISTS Ticket CASCADE;
284
285DROP TABLE IF EXISTS Payment CASCADE;
286
287DROP TABLE IF EXISTS Reservation CASCADE;
288
289DROP TABLE IF EXISTS Schedule CASCADE;
290
291DROP TABLE IF EXISTS "Train Trip" CASCADE;
292
293DROP TABLE IF EXISTS Train CASCADE;
294
295DROP TABLE IF EXISTS Maintenance CASCADE;
296
297DROP TABLE IF EXISTS Segment CASCADE;
298
299DROP TABLE IF EXISTS Platform CASCADE;
300
301DROP TABLE IF EXISTS Passenger CASCADE;
302
303DROP TABLE IF EXISTS Employee CASCADE;
304
305DROP TABLE IF EXISTS Person CASCADE;
306
307DROP TABLE IF EXISTS Route CASCADE;
308
309DROP TABLE IF EXISTS Station CASCADE;
310
311DROP TABLE IF EXISTS Company CASCADE;