| | 1 | = Фаза 2A – Генерирање DDL |
| | 2 | |
| | 3 | == Опис |
| | 4 | Оваа фаза опфаќа генерирање на DDL за ЕР дијаграмот со соодветни ограничувања и дифолтни вредности. |
| | 5 | |
| | 6 | |
| | 7 | == Содржина на DDL скрипта |
| | 8 | |
| | 9 | CREATE TABLE APP_USER ( |
| | 10 | id BIGSERIAL NOT NULL, |
| | 11 | first_name VARCHAR(20), |
| | 12 | last_name VARCHAR(20), |
| | 13 | email VARCHAR(50) NOT NULL UNIQUE, |
| | 14 | phone VARCHAR(20) NOT NULL, |
| | 15 | created_at DATE NOT NULL, |
| | 16 | password_hash VARCHAR(20) NOT NULL, |
| | 17 | PRIMARY KEY (id), |
| | 18 | CONSTRAINT CHK_email_format |
| | 19 | CHECK (email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'), |
| | 20 | CONSTRAINT CHK_phone_number_format |
| | 21 | CHECK (phone ~ '^[0-9]{7,15}$') |
| | 22 | ); |
| | 23 | |
| | 24 | CREATE TABLE ROLES ( |
| | 25 | id BIGSERIAL NOT NULL, |
| | 26 | role VARCHAR(20) NOT NULL, |
| | 27 | PRIMARY KEY (id), |
| | 28 | CONSTRAINT CHK_role_title |
| | 29 | CHECK (role IN ('ADMINISTRATOR', 'USER')) |
| | 30 | ); |
| | 31 | |
| | 32 | CREATE TABLE USER_ROLES ( |
| | 33 | APP_USERid BIGINT NOT NULL, |
| | 34 | ROLESid BIGINT NOT NULL, |
| | 35 | PRIMARY KEY (APP_USERid, ROLESid), |
| | 36 | CONSTRAINT FK_user_roles_user |
| | 37 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 38 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 39 | CONSTRAINT FK_user_roles_role |
| | 40 | FOREIGN KEY (ROLESid) REFERENCES ROLES (id) |
| | 41 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 42 | ); |
| | 43 | |
| | 44 | CREATE TABLE CATEGORIZATION ( |
| | 45 | id BIGSERIAL NOT NULL, |
| | 46 | name VARCHAR(20) NOT NULL, |
| | 47 | PRIMARY KEY (id), |
| | 48 | CONSTRAINT CHK_category_values |
| | 49 | CHECK (name IN ('Concerts', 'Theatre', 'Cinema', 'Festivals', 'Exhibitions', 'Seminars')) |
| | 50 | ); |
| | 51 | |
| | 52 | CREATE TABLE SUBCATEGORY ( |
| | 53 | id BIGSERIAL NOT NULL, |
| | 54 | name VARCHAR(20) NOT NULL, |
| | 55 | CATEGORIZATIONid BIGINT, |
| | 56 | PRIMARY KEY (id), |
| | 57 | CONSTRAINT FK_subcategory_categorization |
| | 58 | FOREIGN KEY (CATEGORIZATIONid) REFERENCES CATEGORIZATION (id) |
| | 59 | ON UPDATE CASCADE ON DELETE SET NULL |
| | 60 | ); |
| | 61 | |
| | 62 | CREATE TABLE USER_CATEGORY_SUBSCRIPTION ( |
| | 63 | APP_USERid BIGINT NOT NULL DEFAULT 1, |
| | 64 | CATEGORIZATIONid BIGINT NOT NULL DEFAULT 1, |
| | 65 | PRIMARY KEY (APP_USERid, CATEGORIZATIONid), |
| | 66 | CONSTRAINT FK_user_category_sub_user |
| | 67 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 68 | ON UPDATE CASCADE ON DELETE SET DEFAULT, |
| | 69 | CONSTRAINT FK_user_category_sub_categorization |
| | 70 | FOREIGN KEY (CATEGORIZATIONid) REFERENCES CATEGORIZATION (id) |
| | 71 | ON UPDATE CASCADE ON DELETE SET DEFAULT |
| | 72 | ); |
| | 73 | |
| | 74 | CREATE TABLE USER_SUBCATEGORY_SUBSCRIPTION ( |
| | 75 | APP_USERid BIGINT NOT NULL DEFAULT 1, |
| | 76 | SUBCATEGORYid BIGINT NOT NULL DEFAULT 1, |
| | 77 | PRIMARY KEY (APP_USERid, SUBCATEGORYid), |
| | 78 | CONSTRAINT FK_user_subcategory_sub_user |
| | 79 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 80 | ON UPDATE CASCADE ON DELETE SET DEFAULT, |
| | 81 | CONSTRAINT FK_user_subcategory_sub_subcategory |
| | 82 | FOREIGN KEY (SUBCATEGORYid) REFERENCES SUBCATEGORY (id) |
| | 83 | ON UPDATE CASCADE ON DELETE SET DEFAULT |
| | 84 | ); |
| | 85 | |
| | 86 | CREATE TABLE EVENT ( |
| | 87 | id BIGSERIAL NOT NULL, |
| | 88 | title VARCHAR(50) NOT NULL, |
| | 89 | description VARCHAR(255), |
| | 90 | start_date DATE NOT NULL, |
| | 91 | end_date DATE NOT NULL, |
| | 92 | CATEGORIZATIONid BIGINT, |
| | 93 | PRIMARY KEY (id), |
| | 94 | CONSTRAINT CHK_event_dates |
| | 95 | CHECK (end_date >= start_date), |
| | 96 | CONSTRAINT FK_event_categorization |
| | 97 | FOREIGN KEY (CATEGORIZATIONid) REFERENCES CATEGORIZATION (id) |
| | 98 | ON UPDATE CASCADE ON DELETE SET NULL |
| | 99 | ); |
| | 100 | |
| | 101 | CREATE TABLE EVENT_IMAGE ( |
| | 102 | id BIGSERIAL NOT NULL, |
| | 103 | image_url VARCHAR(255) NOT NULL, |
| | 104 | EVENTid BIGINT, |
| | 105 | PRIMARY KEY (id), |
| | 106 | CONSTRAINT FK_event_image_event |
| | 107 | FOREIGN KEY (EVENTid) REFERENCES EVENT (id) |
| | 108 | ON UPDATE CASCADE ON DELETE CASCADE |
| | 109 | ); |
| | 110 | |
| | 111 | CREATE TABLE EVENT_ROLE ( |
| | 112 | id BIGSERIAL NOT NULL, |
| | 113 | role VARCHAR(20) NOT NULL, |
| | 114 | PRIMARY KEY (id), |
| | 115 | CONSTRAINT CHK_event_role_values |
| | 116 | CHECK (role IN ('EVENT_ADMIN', 'SALES_MANAGER', 'INFO_ADMIN', 'CONTENT_MANAGER')) |
| | 117 | ); |
| | 118 | |
| | 119 | CREATE TABLE USER_EVENT ( |
| | 120 | APP_USERid BIGINT NOT NULL, |
| | 121 | EVENTid BIGINT NOT NULL, |
| | 122 | EVENT_ROLEid BIGINT NOT NULL, |
| | 123 | PRIMARY KEY (APP_USERid, EVENTid), |
| | 124 | CONSTRAINT FK_user_event_user |
| | 125 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 126 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 127 | CONSTRAINT FK_user_event_event |
| | 128 | FOREIGN KEY (EVENTid) REFERENCES EVENT (id) |
| | 129 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 130 | CONSTRAINT FK_user_event_role |
| | 131 | FOREIGN KEY (EVENT_ROLEid) REFERENCES EVENT_ROLE (id) |
| | 132 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 133 | ); |
| | 134 | |
| | 135 | CREATE TABLE VENUE ( |
| | 136 | id BIGSERIAL NOT NULL, |
| | 137 | name VARCHAR(20) NOT NULL, |
| | 138 | city VARCHAR(20), |
| | 139 | address VARCHAR(50) NOT NULL, |
| | 140 | PRIMARY KEY (id) |
| | 141 | ); |
| | 142 | |
| | 143 | CREATE TABLE HALL ( |
| | 144 | id BIGSERIAL NOT NULL, |
| | 145 | name VARCHAR(20) NOT NULL, |
| | 146 | capacity INT NOT NULL, |
| | 147 | VENUEid BIGINT, |
| | 148 | PRIMARY KEY (id), |
| | 149 | CONSTRAINT CHK_capacity_positive_number |
| | 150 | CHECK (capacity > 0), |
| | 151 | CONSTRAINT FK_hall_venue |
| | 152 | FOREIGN KEY (VENUEid) REFERENCES VENUE (id) |
| | 153 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 154 | ); |
| | 155 | |
| | 156 | CREATE TABLE EVENT_HALL ( |
| | 157 | EVENTid BIGINT NOT NULL, |
| | 158 | HALLid BIGINT NOT NULL, |
| | 159 | allowed_access BOOLEAN NOT NULL, |
| | 160 | PRIMARY KEY (EVENTid, HALLid), |
| | 161 | CONSTRAINT FK_event_hall_event |
| | 162 | FOREIGN KEY (EVENTid) REFERENCES EVENT (id) |
| | 163 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 164 | CONSTRAINT FK_event_hall_hall |
| | 165 | FOREIGN KEY (HALLid) REFERENCES HALL (id) |
| | 166 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 167 | ); |
| | 168 | |
| | 169 | CREATE TABLE TICKET_TYPE ( |
| | 170 | id BIGSERIAL NOT NULL, |
| | 171 | name VARCHAR(50) NOT NULL, |
| | 172 | quantity_available INT NOT NULL, |
| | 173 | PRIMARY KEY (id), |
| | 174 | CONSTRAINT CHK_ticket_quantity_positive_num |
| | 175 | CHECK (quantity_available >= 0), |
| | 176 | CONSTRAINT CHK_ticket_type_values |
| | 177 | CHECK (name IN ('GENERAL_ADMISSION', 'STANDARD', 'PARTER', 'VIP')) |
| | 178 | ); |
| | 179 | |
| | 180 | CREATE TABLE SEAT ( |
| | 181 | id BIGSERIAL NOT NULL, |
| | 182 | number INT NOT NULL, |
| | 183 | HALLid BIGINT, |
| | 184 | TICKET_TYPEid BIGINT, |
| | 185 | PRIMARY KEY (id), |
| | 186 | CONSTRAINT FK_seat_hall |
| | 187 | FOREIGN KEY (HALLid) REFERENCES HALL (id) |
| | 188 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 189 | CONSTRAINT FK_seat_ticket_type |
| | 190 | FOREIGN KEY (TICKET_TYPEid) REFERENCES TICKET_TYPE (id) |
| | 191 | ON UPDATE CASCADE ON DELETE SET NULL |
| | 192 | ); |
| | 193 | |
| | 194 | CREATE TABLE EVENT_TICKET_TYPE ( |
| | 195 | EVENTid BIGINT NOT NULL, |
| | 196 | TICKET_TYPEid BIGINT NOT NULL, |
| | 197 | price INT NOT NULL, |
| | 198 | PRIMARY KEY (EVENTid, TICKET_TYPEid), |
| | 199 | CONSTRAINT CHK_ticket_price_positive_num |
| | 200 | CHECK (price > 0), |
| | 201 | CONSTRAINT FK_event_ticket_type_event |
| | 202 | FOREIGN KEY (EVENTid) REFERENCES EVENT (id) |
| | 203 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 204 | CONSTRAINT FK_event_ticket_type_ticket_type |
| | 205 | FOREIGN KEY (TICKET_TYPEid) REFERENCES TICKET_TYPE (id) |
| | 206 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 207 | ); |
| | 208 | |
| | 209 | CREATE TABLE STATUS ( |
| | 210 | id BIGSERIAL NOT NULL, |
| | 211 | name VARCHAR(20) NOT NULL, |
| | 212 | description VARCHAR(255), |
| | 213 | PRIMARY KEY (id), |
| | 214 | CONSTRAINT CHK_order_status_values |
| | 215 | CHECK (name IN ('CREATED', 'PAID', 'CANCELLED')) |
| | 216 | ); |
| | 217 | |
| | 218 | CREATE TABLE PROMO_CODE ( |
| | 219 | id BIGSERIAL NOT NULL, |
| | 220 | code VARCHAR(20) NOT NULL UNIQUE, |
| | 221 | discount_percent INT NOT NULL, |
| | 222 | expiration_date DATE NOT NULL, |
| | 223 | APP_USERid BIGINT DEFAULT 1, |
| | 224 | PRIMARY KEY (id), |
| | 225 | CONSTRAINT CHK_discount_percent |
| | 226 | CHECK (discount_percent > 0 AND discount_percent < 100), |
| | 227 | CONSTRAINT FK_promo_code_user |
| | 228 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 229 | ON UPDATE CASCADE ON DELETE SET DEFAULT |
| | 230 | ); |
| | 231 | |
| | 232 | CREATE TABLE USER_ORDER ( |
| | 233 | id BIGSERIAL NOT NULL, |
| | 234 | order_date DATE NOT NULL, |
| | 235 | total_amount INT NOT NULL, |
| | 236 | APP_USERid BIGINT, |
| | 237 | STATUSid BIGINT, |
| | 238 | PROMO_CODEid BIGINT, |
| | 239 | PRIMARY KEY (id), |
| | 240 | CONSTRAINT CHK_order_amount_positive_num |
| | 241 | CHECK (total_amount > 0), |
| | 242 | CONSTRAINT FK_user_order_user |
| | 243 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 244 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 245 | CONSTRAINT FK_user_order_status |
| | 246 | FOREIGN KEY (STATUSid) REFERENCES STATUS (id) |
| | 247 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 248 | CONSTRAINT FK_user_order_promo_code |
| | 249 | FOREIGN KEY (PROMO_CODEid) REFERENCES PROMO_CODE (id) |
| | 250 | ON UPDATE CASCADE ON DELETE SET NULL |
| | 251 | ); |
| | 252 | |
| | 253 | CREATE TABLE TICKET ( |
| | 254 | id BIGSERIAL NOT NULL, |
| | 255 | code VARCHAR(50) NOT NULL UNIQUE, |
| | 256 | status VARCHAR(20) NOT NULL, |
| | 257 | TICKET_TYPEid BIGINT, |
| | 258 | USER_ORDERid BIGINT, |
| | 259 | SEATid BIGINT, |
| | 260 | APP_USERid BIGINT, |
| | 261 | EVENTid BIGINT, |
| | 262 | HALLid BIGINT, |
| | 263 | PRIMARY KEY (id), |
| | 264 | CONSTRAINT CHK_ticket_status_values |
| | 265 | CHECK (status IN ('ACTIVE', 'USED', 'CANCELLED')), |
| | 266 | CONSTRAINT FK_ticket_ticket_type |
| | 267 | FOREIGN KEY (TICKET_TYPEid) REFERENCES TICKET_TYPE (id) |
| | 268 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 269 | CONSTRAINT FK_ticket_user_order |
| | 270 | FOREIGN KEY (USER_ORDERid) REFERENCES USER_ORDER (id) |
| | 271 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 272 | CONSTRAINT FK_ticket_seat |
| | 273 | FOREIGN KEY (SEATid) REFERENCES SEAT (id) |
| | 274 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 275 | CONSTRAINT FK_ticket_user |
| | 276 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 277 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 278 | CONSTRAINT FK_ticket_event |
| | 279 | FOREIGN KEY (EVENTid) REFERENCES EVENT (id) |
| | 280 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 281 | CONSTRAINT FK_ticket_hall |
| | 282 | FOREIGN KEY (HALLid) REFERENCES HALL (id) |
| | 283 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 284 | ); |
| | 285 | |
| | 286 | CREATE TABLE PAYMENT_METHOD ( |
| | 287 | id BIGSERIAL NOT NULL, |
| | 288 | name VARCHAR(20) NOT NULL, |
| | 289 | PRIMARY KEY (id), |
| | 290 | CONSTRAINT CHK_payment_method_name |
| | 291 | CHECK (name IN ('CASH', 'CARD')) |
| | 292 | ); |
| | 293 | |
| | 294 | CREATE TABLE PAYMENT ( |
| | 295 | id BIGSERIAL NOT NULL, |
| | 296 | amount INT NOT NULL, |
| | 297 | status VARCHAR(20) NOT NULL, |
| | 298 | payment_date DATE NOT NULL, |
| | 299 | USER_ORDERid BIGINT, |
| | 300 | PAYMENT_METHODid BIGINT, |
| | 301 | PRIMARY KEY (id), |
| | 302 | CONSTRAINT CHK_payment_status_values |
| | 303 | CHECK (status IN ('PENDING', 'COMPLETED', 'FAILED')), |
| | 304 | CONSTRAINT CHK_amount_positive_number |
| | 305 | CHECK (amount > 0), |
| | 306 | CONSTRAINT FK_payment_user_order |
| | 307 | FOREIGN KEY (USER_ORDERid) REFERENCES USER_ORDER (id) |
| | 308 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 309 | CONSTRAINT FK_payment_payment_method |
| | 310 | FOREIGN KEY (PAYMENT_METHODid) REFERENCES PAYMENT_METHOD (id) |
| | 311 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 312 | ); |
| | 313 | |
| | 314 | CREATE TABLE REFUND ( |
| | 315 | id BIGSERIAL NOT NULL, |
| | 316 | amount INT NOT NULL, |
| | 317 | reason VARCHAR(255) NOT NULL, |
| | 318 | status VARCHAR(20) NOT NULL, |
| | 319 | PAYMENTid BIGINT, |
| | 320 | PRIMARY KEY (id), |
| | 321 | CONSTRAINT CHK_refund_amount_positive_num |
| | 322 | CHECK (amount > 0), |
| | 323 | CONSTRAINT CHK_refund_status_values |
| | 324 | CHECK (status IN ('REQUESTED', 'APPROVED', 'REJECTED')), |
| | 325 | CONSTRAINT FK_refund_payment |
| | 326 | FOREIGN KEY (PAYMENTid) REFERENCES PAYMENT (id) |
| | 327 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 328 | ); |
| | 329 | |
| | 330 | CREATE TABLE REVIEW ( |
| | 331 | id BIGSERIAL NOT NULL, |
| | 332 | rating INT NOT NULL, |
| | 333 | comment VARCHAR(255), |
| | 334 | APP_USERid BIGINT DEFAULT 1, |
| | 335 | EVENTid BIGINT, |
| | 336 | PRIMARY KEY (id), |
| | 337 | CONSTRAINT CHK_rating_range |
| | 338 | CHECK (rating BETWEEN 1 AND 5), |
| | 339 | CONSTRAINT FK_review_user |
| | 340 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 341 | ON UPDATE CASCADE ON DELETE SET DEFAULT, |
| | 342 | CONSTRAINT FK_review_event |
| | 343 | FOREIGN KEY (EVENTid) REFERENCES EVENT (id) |
| | 344 | ON UPDATE CASCADE ON DELETE CASCADE |
| | 345 | ); |
| | 346 | |
| | 347 | CREATE TABLE NOTIFICATION ( |
| | 348 | id BIGSERIAL NOT NULL, |
| | 349 | message VARCHAR(150) NOT NULL, |
| | 350 | created_at DATE NOT NULL, |
| | 351 | APP_USERid BIGINT DEFAULT 1, |
| | 352 | PRIMARY KEY (id), |
| | 353 | CONSTRAINT FK_notification_user |
| | 354 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 355 | ON UPDATE CASCADE ON DELETE SET DEFAULT |
| | 356 | ); |
| | 357 | |
| | 358 | CREATE TABLE WAITLIST ( |
| | 359 | id BIGSERIAL NOT NULL, |
| | 360 | created_at DATE NOT NULL, |
| | 361 | status VARCHAR(20) NOT NULL, |
| | 362 | EVENTid BIGINT, |
| | 363 | PRIMARY KEY (id), |
| | 364 | CONSTRAINT CHK_waitlist_status_values |
| | 365 | CHECK (status IN ('PENDING', 'CONFIRMED', 'CANCELLED')), |
| | 366 | CONSTRAINT FK_waitlist_event |
| | 367 | FOREIGN KEY (EVENTid) REFERENCES EVENT (id) |
| | 368 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 369 | ); |
| | 370 | |
| | 371 | CREATE TABLE USER_WAITLIST ( |
| | 372 | APP_USERid BIGINT NOT NULL, |
| | 373 | WAITLISTid BIGINT NOT NULL, |
| | 374 | PRIMARY KEY (APP_USERid, WAITLISTid), |
| | 375 | CONSTRAINT FK_user_waitlist_user |
| | 376 | FOREIGN KEY (APP_USERid) REFERENCES APP_USER (id) |
| | 377 | ON UPDATE CASCADE ON DELETE RESTRICT, |
| | 378 | CONSTRAINT FK_user_waitlist_waitlist |
| | 379 | FOREIGN KEY (WAITLISTid) REFERENCES WAITLIST (id) |
| | 380 | ON UPDATE CASCADE ON DELETE RESTRICT |
| | 381 | ); |