| | 1 | = Database Creation = |
| | 2 | |
| | 3 | === Имплементациски детали === |
| | 4 | |
| | 5 | Во овој проект, преку DDL наредби се креирани сите потребни табели за системот за управување со такси апликација, како и нивните меѓусебни релации. |
| | 6 | |
| | 7 | Во скриптите се опфатени: |
| | 8 | * примарни клучеви (PRIMARY KEY) |
| | 9 | * надворешни клучеви (FOREIGN KEY) |
| | 10 | * ограничувања за интегритет (CHECK, UNIQUE, NOT NULL) |
| | 11 | * правила за ажурирање и бришење (ON DELETE, ON UPDATE) |
| | 12 | |
| | 13 | Со овие DDL наредби се обезбедува конзистентност, интегритет и правилна организација на податоците во базата. |
| | 14 | |
| | 15 | === DDL Скрипти === |
| | 16 | |
| | 17 | ``` |
| | 18 | CREATE TABLE Status ( |
| | 19 | status_id SERIAL PRIMARY KEY, |
| | 20 | status_tip VARCHAR(255) NOT NULL, |
| | 21 | status_text VARCHAR(255) NOT NULL |
| | 22 | ); |
| | 23 | |
| | 24 | CREATE TABLE Vehicles_model ( |
| | 25 | Vehicles_model_id SERIAL PRIMARY KEY, |
| | 26 | Model VARCHAR(255) NOT NULL |
| | 27 | ); |
| | 28 | |
| | 29 | CREATE TABLE Locations ( |
| | 30 | location_id SERIAL PRIMARY KEY, |
| | 31 | latitude NUMERIC(9,6) NOT NULL, |
| | 32 | longitude NUMERIC(9,6) NOT NULL, |
| | 33 | grad VARCHAR(255) NOT NULL, |
| | 34 | naselba VARCHAR(255) NOT NULL, |
| | 35 | ulica VARCHAR(255) NOT NULL, |
| | 36 | broj VARCHAR(255) NOT NULL, |
| | 37 | created_at TIMESTAMP NOT NULL |
| | 38 | ); |
| | 39 | |
| | 40 | CREATE TABLE Users ( |
| | 41 | User_id SERIAL PRIMARY KEY, |
| | 42 | name VARCHAR(255) NOT NULL, |
| | 43 | username VARCHAR(255) NOT NULL UNIQUE, |
| | 44 | phone VARCHAR(255) NOT NULL UNIQUE, |
| | 45 | email VARCHAR(255) NOT NULL UNIQUE, |
| | 46 | password_hash TEXT NOT NULL, |
| | 47 | created_at TIMESTAMP NOT NULL, |
| | 48 | status_id INT NOT NULL, |
| | 49 | |
| | 50 | CONSTRAINT chk_users_phone CHECK (phone ~ '^[0-9+]+$'), |
| | 51 | CONSTRAINT chk_users_email CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$'), |
| | 52 | |
| | 53 | CONSTRAINT FK_Users_Status |
| | 54 | FOREIGN KEY (status_id) REFERENCES Status(status_id) |
| | 55 | ON DELETE RESTRICT |
| | 56 | ON UPDATE CASCADE |
| | 57 | ); |
| | 58 | |
| | 59 | CREATE TABLE Drivers ( |
| | 60 | driver_id SERIAL PRIMARY KEY, |
| | 61 | name VARCHAR(255) NOT NULL, |
| | 62 | phone VARCHAR(255) NOT NULL UNIQUE, |
| | 63 | license_number VARCHAR(255) NOT NULL UNIQUE, |
| | 64 | registration_date DATE NOT NULL, |
| | 65 | rating NUMERIC(3,2) NOT NULL, |
| | 66 | status_id INT NOT NULL, |
| | 67 | |
| | 68 | CONSTRAINT chk_drivers_phone CHECK (phone ~ '^[0-9+]+$'), |
| | 69 | CONSTRAINT chk_drivers_rating CHECK (rating BETWEEN 0 AND 5), |
| | 70 | |
| | 71 | CONSTRAINT FK_Drivers_Status |
| | 72 | FOREIGN KEY (status_id) REFERENCES Status(status_id) |
| | 73 | ON DELETE RESTRICT |
| | 74 | ON UPDATE CASCADE |
| | 75 | ); |
| | 76 | |
| | 77 | CREATE TABLE Admins ( |
| | 78 | admins_id SERIAL PRIMARY KEY, |
| | 79 | name VARCHAR(255) NOT NULL, |
| | 80 | username VARCHAR(255) NOT NULL UNIQUE, |
| | 81 | phone VARCHAR(255) NOT NULL UNIQUE, |
| | 82 | email VARCHAR(255) NOT NULL UNIQUE, |
| | 83 | password_hash TEXT NOT NULL, |
| | 84 | created_at TIMESTAMP NOT NULL, |
| | 85 | status_id INT NOT NULL, |
| | 86 | |
| | 87 | CONSTRAINT chk_admins_phone CHECK (phone ~ '^[0-9+]+$'), |
| | 88 | CONSTRAINT chk_admins_email CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$'), |
| | 89 | |
| | 90 | CONSTRAINT FK_Admins_Status |
| | 91 | FOREIGN KEY (status_id) REFERENCES Status(status_id) |
| | 92 | ON DELETE RESTRICT |
| | 93 | ON UPDATE CASCADE |
| | 94 | ); |
| | 95 | |
| | 96 | CREATE TABLE Vehicle_types ( |
| | 97 | vehicle_type_id SERIAL PRIMARY KEY, |
| | 98 | type_name VARCHAR(255) NOT NULL, |
| | 99 | description VARCHAR(255) NOT NULL, |
| | 100 | Vehicles_model_id INT NOT NULL, |
| | 101 | |
| | 102 | CONSTRAINT FK_Vehicle_types_Model |
| | 103 | FOREIGN KEY (Vehicles_model_id) |
| | 104 | REFERENCES Vehicles_model(Vehicles_model_id) |
| | 105 | ON DELETE RESTRICT |
| | 106 | ON UPDATE CASCADE |
| | 107 | ); |
| | 108 | |
| | 109 | CREATE TABLE Vehicle_ownership ( |
| | 110 | Vehicle_ownership_id SERIAL PRIMARY KEY, |
| | 111 | Plate VARCHAR(255) NOT NULL UNIQUE, |
| | 112 | Traffic_permit VARCHAR(255) NOT NULL UNIQUE, |
| | 113 | Color VARCHAR(255) NOT NULL, |
| | 114 | year INT NOT NULL, |
| | 115 | vehicle_type_id INT NOT NULL, |
| | 116 | |
| | 117 | |
| | 118 | CONSTRAINT chk_vehicle_year CHECK (year >= 1900), |
| | 119 | |
| | 120 | CONSTRAINT FK_Vehicle_ownership_Type |
| | 121 | FOREIGN KEY (vehicle_type_id) |
| | 122 | REFERENCES Vehicle_types(vehicle_type_id) |
| | 123 | ON DELETE RESTRICT |
| | 124 | ON UPDATE CASCADE |
| | 125 | ); |
| | 126 | |
| | 127 | CREATE TABLE Pricing_rules ( |
| | 128 | tariff_id SERIAL PRIMARY KEY, |
| | 129 | base_price NUMERIC(10,2) NOT NULL, |
| | 130 | price_per_km NUMERIC(10,2) NOT NULL, |
| | 131 | vehicle_type_id INT NOT NULL, |
| | 132 | |
| | 133 | CONSTRAINT chk_price CHECK (base_price >= 0 AND price_per_km >= 0), |
| | 134 | |
| | 135 | CONSTRAINT FK_Pricing_rules_Vehicle_types |
| | 136 | FOREIGN KEY (vehicle_type_id) |
| | 137 | REFERENCES Vehicle_types(vehicle_type_id) |
| | 138 | ON DELETE RESTRICT |
| | 139 | ON UPDATE CASCADE |
| | 140 | ); |
| | 141 | |
| | 142 | CREATE TABLE Drivers_Vehicle_ownership ( |
| | 143 | driver_id INT NOT NULL, |
| | 144 | Vehicle_ownership_id INT NOT NULL, |
| | 145 | |
| | 146 | PRIMARY KEY (driver_id, Vehicle_ownership_id), |
| | 147 | |
| | 148 | CONSTRAINT FK_DVO_Drivers |
| | 149 | FOREIGN KEY (driver_id) |
| | 150 | REFERENCES Drivers(driver_id) |
| | 151 | ON DELETE CASCADE, |
| | 152 | |
| | 153 | CONSTRAINT FK_DVO_Vehicles |
| | 154 | FOREIGN KEY (Vehicle_ownership_id) |
| | 155 | REFERENCES Vehicle_ownership(Vehicle_ownership_id) |
| | 156 | ON DELETE CASCADE |
| | 157 | ); |
| | 158 | |
| | 159 | CREATE TABLE Active_drivers ( |
| | 160 | driver_id INT PRIMARY KEY, |
| | 161 | current_location_id INT NOT NULL, |
| | 162 | is_available BOOLEAN NOT NULL, |
| | 163 | working_start TIMESTAMP NOT NULL, |
| | 164 | working_end TIMESTAMP NOT NULL, |
| | 165 | vehicle_ownership_id INT NOT NULL, |
| | 166 | |
| | 167 | CONSTRAINT FK_Active_drivers_Drivers |
| | 168 | FOREIGN KEY (driver_id) |
| | 169 | REFERENCES Drivers(driver_id) |
| | 170 | ON DELETE CASCADE, |
| | 171 | |
| | 172 | CONSTRAINT FK_Active_drivers_Locations |
| | 173 | FOREIGN KEY (current_location_id) |
| | 174 | REFERENCES Locations(location_id) |
| | 175 | ON DELETE RESTRICT, |
| | 176 | |
| | 177 | CONSTRAINT FK_Active_drivers_vehicle_ownership_id |
| | 178 | FOREIGN KEY (vehicle_ownership_id) |
| | 179 | REFERENCES Vehicle_ownership(Vehicle_ownership_id) |
| | 180 | ON DELETE RESTRICT |
| | 181 | ); |
| | 182 | |
| | 183 | CREATE TABLE Rides ( |
| | 184 | ride_id SERIAL PRIMARY KEY, |
| | 185 | user_id INT NOT NULL, |
| | 186 | driver_id INT NOT NULL, |
| | 187 | vehicle_ownership_id INT NOT NULL, |
| | 188 | pickup_location_id INT NOT NULL, |
| | 189 | dropoff_location_id INT NOT NULL, |
| | 190 | status_id INT NOT NULL, |
| | 191 | request_time TIMESTAMP NOT NULL, |
| | 192 | pickup_time TIMESTAMP NOT NULL, |
| | 193 | start_time TIMESTAMP NOT NULL, |
| | 194 | end_time TIMESTAMP NOT NULL, |
| | 195 | distance_km NUMERIC(6,2) NOT NULL, |
| | 196 | final_price NUMERIC(10,2) NOT NULL, |
| | 197 | discount_percentage NUMERIC(5,2) NOT NULL, |
| | 198 | |
| | 199 | |
| | 200 | CONSTRAINT chk_distance CHECK (distance_km >= 0), |
| | 201 | CONSTRAINT chk_discount CHECK (discount_percentage BETWEEN 0 AND 100), |
| | 202 | |
| | 203 | CONSTRAINT FK_Rides_Users |
| | 204 | FOREIGN KEY (user_id) REFERENCES Users(User_id) ON DELETE RESTRICT, |
| | 205 | |
| | 206 | CONSTRAINT FK_Rides_vehicle_ownership_id |
| | 207 | FOREIGN KEY (vehicle_ownership_id) REFERENCES Vehicle_ownership(Vehicle_ownership_id) ON DELETE RESTRICT, |
| | 208 | |
| | 209 | CONSTRAINT FK_Rides_Drivers |
| | 210 | FOREIGN KEY (driver_id) REFERENCES Drivers(driver_id) ON DELETE RESTRICT, |
| | 211 | |
| | 212 | CONSTRAINT FK_Rides_Pickup_Location |
| | 213 | FOREIGN KEY (pickup_location_id) REFERENCES Locations(location_id) ON DELETE RESTRICT, |
| | 214 | |
| | 215 | CONSTRAINT FK_Rides_Dropoff_Location |
| | 216 | FOREIGN KEY (dropoff_location_id) REFERENCES Locations(location_id) ON DELETE RESTRICT, |
| | 217 | |
| | 218 | CONSTRAINT FK_Rides_Status |
| | 219 | FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT |
| | 220 | ); |
| | 221 | |
| | 222 | CREATE TABLE Payment_methods( |
| | 223 | payment_method_id SERIAL PRIMARY KEY, |
| | 224 | payment_tip VARCHAR(255) NOT NULL |
| | 225 | ); |
| | 226 | |
| | 227 | CREATE TABLE Payments ( |
| | 228 | payment_id SERIAL PRIMARY KEY, |
| | 229 | amount NUMERIC(10,2) NOT NULL, |
| | 230 | payment_method_id INT NOT NULL, |
| | 231 | payment_time TIMESTAMP NOT NULL, |
| | 232 | ride_id INT NOT NULL, |
| | 233 | status_id INT NOT NULL, |
| | 234 | |
| | 235 | CONSTRAINT chk_amount CHECK (amount >= 0), |
| | 236 | |
| | 237 | CONSTRAINT FK_Payments_Rides |
| | 238 | FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE, |
| | 239 | |
| | 240 | CONSTRAINT FK_Payments_Status |
| | 241 | FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT, |
| | 242 | |
| | 243 | CONSTRAINT FK_Payments_Method |
| | 244 | FOREIGN KEY (payment_method_id) REFERENCES Payment_methods(payment_method_id) ON DELETE RESTRICT |
| | 245 | ); |
| | 246 | |
| | 247 | CREATE TABLE Ratings ( |
| | 248 | rating_id SERIAL PRIMARY KEY, |
| | 249 | score INT NOT NULL, |
| | 250 | comment VARCHAR(255), |
| | 251 | created_at TIMESTAMP NOT NULL, |
| | 252 | ride_id INT NOT NULL, |
| | 253 | User_id INT NOT NULL, |
| | 254 | driver_id INT NOT NULL, |
| | 255 | |
| | 256 | CONSTRAINT chk_score CHECK (score BETWEEN 1 AND 5), |
| | 257 | |
| | 258 | CONSTRAINT FK_Ratings_Rides |
| | 259 | FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE, |
| | 260 | |
| | 261 | CONSTRAINT FK_Ratings_Users |
| | 262 | FOREIGN KEY (User_id) REFERENCES Users(User_id) ON DELETE CASCADE, |
| | 263 | |
| | 264 | CONSTRAINT FK_Ratings_Drivers |
| | 265 | FOREIGN KEY (driver_id) REFERENCES Drivers(driver_id) ON DELETE CASCADE |
| | 266 | ); |
| | 267 | |
| | 268 | CREATE TABLE Cancellations ( |
| | 269 | cancellation_id SERIAL PRIMARY KEY, |
| | 270 | cancelled_by_type VARCHAR(255) NOT NULL, |
| | 271 | cancelled_by_id INT NOT NULL, |
| | 272 | reason VARCHAR(255) NOT NULL, |
| | 273 | cancellation_fee NUMERIC(10,2) NOT NULL, |
| | 274 | created_at TIMESTAMP NOT NULL, |
| | 275 | ride_id INT NOT NULL, |
| | 276 | |
| | 277 | CONSTRAINT chk_fee CHECK (cancellation_fee >= 0), |
| | 278 | CONSTRAINT chk_cancelled_by_type CHECK (cancelled_by_type IN ('USER', 'DRIVER', 'ADMIN')), |
| | 279 | |
| | 280 | CONSTRAINT FK_Cancellations_Rides |
| | 281 | FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE |
| | 282 | ); |
| | 283 | |
| | 284 | CREATE TABLE Messages( |
| | 285 | message_id SERIAL PRIMARY KEY, |
| | 286 | message_text VARCHAR(255) NOT NULL |
| | 287 | |
| | 288 | ); |
| | 289 | |
| | 290 | CREATE TABLE Notifications ( |
| | 291 | notification_id SERIAL PRIMARY KEY, |
| | 292 | message_id INT NOT NULL, |
| | 293 | sent_time TIMESTAMP NOT NULL, |
| | 294 | User_id INT NOT NULL, |
| | 295 | ride_id INT NOT NULL, |
| | 296 | status_id INT NOT NULL, |
| | 297 | |
| | 298 | CONSTRAINT FK_Notifications_Users |
| | 299 | FOREIGN KEY (User_id) REFERENCES Users(User_id) ON DELETE CASCADE, |
| | 300 | |
| | 301 | CONSTRAINT FK_Notifications_Rides |
| | 302 | |
| | 303 | FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE, |
| | 304 | |
| | 305 | CONSTRAINT FK_Notifications_Status |
| | 306 | FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT, |
| | 307 | |
| | 308 | CONSTRAINT FK_Notifications_Messages |
| | 309 | FOREIGN KEY (message_id) REFERENCES Messages(message_id) ON DELETE CASCADE |
| | 310 | ); |
| | 311 | ``` |