| 1 | CREATE 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 | );
|
|---|
| 8 | CREATE 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 |
|
|---|
| 25 | CREATE 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 |
|
|---|
| 39 | CREATE 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 |
|
|---|
| 46 | CREATE 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 |
|
|---|
| 56 | CREATE 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 |
|
|---|
| 66 | CREATE 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 | );
|
|---|
| 77 | CREATE 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 |
|
|---|
| 92 | CREATE 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 | );
|
|---|
| 100 | CREATE 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 |
|
|---|
| 110 | CREATE 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),
|
|---|
| 120 | CONSTRAINT 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 |
|
|---|
| 126 | CREATE 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 |
|
|---|
| 136 | CREATE TABLE Route (
|
|---|
| 137 | route_id SERIAL NOT NULL,
|
|---|
| 138 | route_name VARCHAR(20),
|
|---|
| 139 | type int4,
|
|---|
| 140 | PRIMARY KEY (route_id)
|
|---|
| 141 | );
|
|---|
| 142 |
|
|---|
| 143 | CREATE 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),
|
|---|
| 153 | CONSTRAINT 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 |
|
|---|
| 162 | CREATE 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,
|
|---|
| 173 | CONSTRAINT owns FOREIGN KEY (Companycompany_id) REFERENCES Company (company_id) ON DELETE RESTRICT
|
|---|
| 174 | );
|
|---|
| 175 |
|
|---|
| 176 |
|
|---|
| 177 | CREATE 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 |
|
|---|
| 191 | CREATE 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),
|
|---|
| 208 | CONSTRAINT trip_follows FOREIGN KEY (Routeroute_id) REFERENCES Route (route_id)
|
|---|
| 209 | );
|
|---|
| 210 |
|
|---|
| 211 | CREATE 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 |
|
|---|
| 229 | CREATE 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,
|
|---|
| 236 | CONSTRAINT includes FOREIGN KEY ("Train Triptrip_id") REFERENCES "Train Trip" (trip_id),
|
|---|
| 237 | CONSTRAINT provides FOREIGN KEY (Traintrain_id) REFERENCES Train (train_id)
|
|---|
| 238 | );
|
|---|
| 239 |
|
|---|
| 240 |
|
|---|
| 241 | CREATE 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 |
|
|---|
| 250 | CREATE 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 |
|
|---|
| 258 | CREATE 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 |
|
|---|
| 269 | DROP TABLE IF EXISTS "Train Trip_Segment" CASCADE;
|
|---|
| 270 |
|
|---|
| 271 | DROP TABLE IF EXISTS train_stops_at_station CASCADE;
|
|---|
| 272 |
|
|---|
| 273 | DROP TABLE IF EXISTS Train_undergoes_Maintenance CASCADE;
|
|---|
| 274 |
|
|---|
| 275 | DROP TABLE IF EXISTS "Employee_operates_Train Service" CASCADE;
|
|---|
| 276 |
|
|---|
| 277 | DROP TABLE IF EXISTS Employee_performs_Maintenance CASCADE;
|
|---|
| 278 |
|
|---|
| 279 | DROP TABLE IF EXISTS Route_Segment CASCADE;
|
|---|
| 280 |
|
|---|
| 281 | DROP TABLE IF EXISTS "Train Service" CASCADE;
|
|---|
| 282 |
|
|---|
| 283 | DROP TABLE IF EXISTS Ticket CASCADE;
|
|---|
| 284 |
|
|---|
| 285 | DROP TABLE IF EXISTS Payment CASCADE;
|
|---|
| 286 |
|
|---|
| 287 | DROP TABLE IF EXISTS Reservation CASCADE;
|
|---|
| 288 |
|
|---|
| 289 | DROP TABLE IF EXISTS Schedule CASCADE;
|
|---|
| 290 |
|
|---|
| 291 | DROP TABLE IF EXISTS "Train Trip" CASCADE;
|
|---|
| 292 |
|
|---|
| 293 | DROP TABLE IF EXISTS Train CASCADE;
|
|---|
| 294 |
|
|---|
| 295 | DROP TABLE IF EXISTS Maintenance CASCADE;
|
|---|
| 296 |
|
|---|
| 297 | DROP TABLE IF EXISTS Segment CASCADE;
|
|---|
| 298 |
|
|---|
| 299 | DROP TABLE IF EXISTS Platform CASCADE;
|
|---|
| 300 |
|
|---|
| 301 | DROP TABLE IF EXISTS Passenger CASCADE;
|
|---|
| 302 |
|
|---|
| 303 | DROP TABLE IF EXISTS Employee CASCADE;
|
|---|
| 304 |
|
|---|
| 305 | DROP TABLE IF EXISTS Person CASCADE;
|
|---|
| 306 |
|
|---|
| 307 | DROP TABLE IF EXISTS Route CASCADE;
|
|---|
| 308 |
|
|---|
| 309 | DROP TABLE IF EXISTS Station CASCADE;
|
|---|
| 310 |
|
|---|
| 311 | DROP TABLE IF EXISTS Company CASCADE; |
|---|