| | 6 | ```sql |
| | 7 | |
| | 8 | CREATE TABLE "Event" ( |
| | 9 | event_id BIGSERIAL PRIMARY KEY, |
| | 10 | name VARCHAR(255) NOT NULL, |
| | 11 | description TEXT NOT NULL, |
| | 12 | min_age INT NOT NULL |
| | 13 | ); |
| | 14 | |
| | 15 | CREATE TABLE "Concert" ( |
| | 16 | event_id BIGINT PRIMARY KEY, |
| | 17 | concert_type VARCHAR(50) NOT NULL, |
| | 18 | setlist TEXT NOT NULL, |
| | 19 | |
| | 20 | CONSTRAINT fk_concert_event FOREIGN KEY (event_id) REFERENCES "Event" (event_id) |
| | 21 | ON DELETE CASCADE |
| | 22 | ON UPDATE CASCADE |
| | 23 | ); |
| | 24 | |
| | 25 | CREATE TABLE "Play" ( |
| | 26 | event_id BIGINT PRIMARY KEY, |
| | 27 | genre VARCHAR(50) NOT NULL, |
| | 28 | number_of_acts INT NOT NULL, |
| | 29 | language VARCHAR(50) NOT NULL, |
| | 30 | director VARCHAR(255) NOT NULL, |
| | 31 | |
| | 32 | CONSTRAINT fk_play_event FOREIGN KEY (event_id) REFERENCES "Event" (event_id) |
| | 33 | ON DELETE CASCADE |
| | 34 | ON UPDATE CASCADE |
| | 35 | ); |
| | 36 | |
| | 37 | |
| | 38 | CREATE TABLE "Performer" ( |
| | 39 | performer_id BIGSERIAL PRIMARY KEY, |
| | 40 | name VARCHAR(255) NOT NULL, |
| | 41 | number_of_members INT NOT NULL, |
| | 42 | contact_email VARCHAR(255) NOT NULL UNIQUE, |
| | 43 | technical_requirements TEXT NOT NULL, |
| | 44 | |
| | 45 | CONSTRAINT performer_contact_email_check CHECK (contact_email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') |
| | 46 | ); |
| | 47 | |
| | 48 | CREATE TABLE "Musical_Performer" ( |
| | 49 | performer_id BIGINT PRIMARY KEY, |
| | 50 | musician_type VARCHAR(50) NOT NULL, |
| | 51 | genre VARCHAR(50) NOT NULL, |
| | 52 | record_label VARCHAR(255) NOT NULL, |
| | 53 | |
| | 54 | CONSTRAINT fk_musical_performer_performer FOREIGN KEY (performer_id) REFERENCES "Performer" (performer_id) |
| | 55 | ON DELETE CASCADE |
| | 56 | ON UPDATE CASCADE |
| | 57 | ); |
| | 58 | |
| | 59 | CREATE TABLE "Acting_Performer" ( |
| | 60 | performer_id BIGINT PRIMARY KEY, |
| | 61 | role_type VARCHAR(50) NOT NULL, |
| | 62 | acting_style VARCHAR(100) NOT NULL, |
| | 63 | agency VARCHAR(255) NOT NULL, |
| | 64 | |
| | 65 | CONSTRAINT fk_acting_performer_performer FOREIGN KEY (performer_id) REFERENCES "Performer" (performer_id) |
| | 66 | ON DELETE CASCADE |
| | 67 | ON UPDATE CASCADE |
| | 68 | ); |
| | 69 | |
| | 70 | |
| | 71 | CREATE TABLE "Venue" ( |
| | 72 | venue_id BIGSERIAL PRIMARY KEY, |
| | 73 | name VARCHAR(255) NOT NULL, |
| | 74 | number_of_sections INT NOT NULL, |
| | 75 | number_of_seats INT NOT NULL, |
| | 76 | address_street VARCHAR(255) NOT NULL, |
| | 77 | address_city VARCHAR(100) NOT NULL, |
| | 78 | address_country VARCHAR(100) NOT NULL |
| | 79 | ); |
| | 80 | |
| | 81 | CREATE TABLE "Section" ( |
| | 82 | section_id BIGSERIAL PRIMARY KEY, |
| | 83 | venue_id BIGINT NOT NULL, |
| | 84 | name VARCHAR(255) NOT NULL, |
| | 85 | number_of_seats INT NOT NULL, |
| | 86 | |
| | 87 | CONSTRAINT fk_section_venue FOREIGN KEY (venue_id) REFERENCES "Venue" (venue_id) |
| | 88 | ON DELETE CASCADE |
| | 89 | ON UPDATE CASCADE, |
| | 90 | CONSTRAINT uq_section_venue_name UNIQUE (venue_id, name) |
| | 91 | ); |
| | 92 | |
| | 93 | CREATE TABLE "Seat" ( |
| | 94 | seat_id BIGSERIAL PRIMARY KEY, |
| | 95 | section_id BIGINT NOT NULL, |
| | 96 | seat_number INT NOT NULL, |
| | 97 | |
| | 98 | CONSTRAINT fk_seat_section FOREIGN KEY (section_id) REFERENCES "Section" (section_id) |
| | 99 | ON DELETE CASCADE |
| | 100 | ON UPDATE CASCADE, |
| | 101 | CONSTRAINT uq_seat_section_number UNIQUE (section_id, seat_number) |
| | 102 | ); |
| | 103 | |
| | 104 | |
| | 105 | CREATE TABLE "Organizer" ( |
| | 106 | organizer_id BIGSERIAL PRIMARY KEY, |
| | 107 | name VARCHAR(255) NOT NULL, |
| | 108 | contact_email VARCHAR(255) NOT NULL UNIQUE, |
| | 109 | |
| | 110 | CONSTRAINT organizer_contact_email_check CHECK (contact_email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') |
| | 111 | ); |
| | 112 | |
| | 113 | CREATE TABLE "Sponsor" ( |
| | 114 | sponsor_id BIGSERIAL PRIMARY KEY, |
| | 115 | name VARCHAR(255) NOT NULL, |
| | 116 | contact_email VARCHAR(255) NOT NULL UNIQUE, |
| | 117 | sponsor_type VARCHAR(50) NOT NULL, |
| | 118 | |
| | 119 | CONSTRAINT sponsor_contact_email_check CHECK (contact_email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') |
| | 120 | ); |
| | 121 | |
| | 122 | |
| | 123 | CREATE TABLE "Event_Happening" ( |
| | 124 | event_happening_id BIGSERIAL PRIMARY KEY, |
| | 125 | event_id BIGINT NOT NULL, |
| | 126 | event_time TIMESTAMP NOT NULL, |
| | 127 | venue_id BIGINT NOT NULL, |
| | 128 | duration INT NOT NULL, |
| | 129 | |
| | 130 | CONSTRAINT fk_event_happening_event FOREIGN KEY (event_id) REFERENCES "Event" (event_id) |
| | 131 | ON DELETE RESTRICT |
| | 132 | ON UPDATE CASCADE, |
| | 133 | CONSTRAINT fk_event_happening_venue FOREIGN KEY (venue_id) REFERENCES "Venue" (venue_id) |
| | 134 | ON DELETE RESTRICT |
| | 135 | ON UPDATE CASCADE, |
| | 136 | CONSTRAINT uq_happening_time_venue UNIQUE (event_time, venue_id) |
| | 137 | ); |
| | 138 | |
| | 139 | CREATE TABLE "Event_Period" ( |
| | 140 | period_id BIGSERIAL PRIMARY KEY, |
| | 141 | event_happening_id BIGINT NOT NULL, |
| | 142 | name VARCHAR(255) NOT NULL, |
| | 143 | start_date DATE NOT NULL, |
| | 144 | end_date DATE NOT NULL, |
| | 145 | price_change_percent INT NOT NULL, |
| | 146 | increase_decrease BOOLEAN NOT NULL, |
| | 147 | |
| | 148 | CONSTRAINT fk_event_period_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id) |
| | 149 | ON DELETE CASCADE |
| | 150 | ON UPDATE CASCADE, |
| | 151 | CONSTRAINT uq_period_happening_name UNIQUE (event_happening_id, name), |
| | 152 | CONSTRAINT event_period_dates_check CHECK (start_date <= end_date) |
| | 153 | ); |
| | 154 | |
| | 155 | |
| | 156 | CREATE TABLE "Event_Happening_Performer" ( |
| | 157 | event_happening_id BIGINT NOT NULL, |
| | 158 | performer_id BIGINT NOT NULL, |
| | 159 | |
| | 160 | CONSTRAINT pk_event_happening_performer PRIMARY KEY (event_happening_id, performer_id), |
| | 161 | CONSTRAINT fk_ehp_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id) |
| | 162 | ON DELETE CASCADE |
| | 163 | ON UPDATE CASCADE, |
| | 164 | CONSTRAINT fk_ehp_performer FOREIGN KEY (performer_id) REFERENCES "Performer" (performer_id) |
| | 165 | ON DELETE CASCADE |
| | 166 | ON UPDATE CASCADE, |
| | 167 | CONSTRAINT uq_performer_at_time UNIQUE (performer_id, event_happening_id) |
| | 168 | ); |
| | 169 | |
| | 170 | CREATE TABLE "Event_Happening_Organizer" ( |
| | 171 | event_happening_id BIGINT NOT NULL, |
| | 172 | organizer_id BIGINT NOT NULL, |
| | 173 | |
| | 174 | CONSTRAINT event_happening_organizer PRIMARY KEY (event_happening_id, organizer_id), |
| | 175 | CONSTRAINT fk_eho_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id) |
| | 176 | ON DELETE CASCADE |
| | 177 | ON UPDATE CASCADE, |
| | 178 | CONSTRAINT fk_eho_organizer FOREIGN KEY (organizer_id) REFERENCES "Organizer" (organizer_id) |
| | 179 | ON DELETE CASCADE |
| | 180 | ON UPDATE CASCADE |
| | 181 | ); |
| | 182 | |
| | 183 | CREATE TABLE "Event_Happening_Sponsor" ( |
| | 184 | event_happening_id BIGINT NOT NULL, |
| | 185 | sponsor_id BIGINT NOT NULL, |
| | 186 | |
| | 187 | CONSTRAINT event_happening_sponsor PRIMARY KEY (event_happening_id, sponsor_id), |
| | 188 | CONSTRAINT fk_ehs_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id) |
| | 189 | ON DELETE CASCADE |
| | 190 | ON UPDATE CASCADE, |
| | 191 | CONSTRAINT fk_ehs_sponsor FOREIGN KEY (sponsor_id) REFERENCES "Sponsor" (sponsor_id) |
| | 192 | ON DELETE CASCADE |
| | 193 | ON UPDATE CASCADE |
| | 194 | ); |
| | 195 | |
| | 196 | |
| | 197 | CREATE TABLE "User" ( |
| | 198 | user_id BIGSERIAL PRIMARY KEY, |
| | 199 | username VARCHAR(50) NOT NULL UNIQUE, |
| | 200 | first_name VARCHAR(100) NOT NULL, |
| | 201 | last_name VARCHAR(100) NOT NULL, |
| | 202 | date_of_birth DATE NOT NULL, |
| | 203 | contact_email VARCHAR(255) NOT NULL UNIQUE, |
| | 204 | password VARCHAR(100) NOT NULL, |
| | 205 | registration_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | 206 | |
| | 207 | CONSTRAINT user_date_of_birth_check CHECK (date_of_birth < CURRENT_DATE), |
| | 208 | CONSTRAINT user_contact_email_check CHECK (contact_email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'), |
| | 209 | CONSTRAINT user_password_check CHECK ( |
| | 210 | length(password) >= 8 AND |
| | 211 | password ~ '[A-Z]' AND |
| | 212 | password ~ '[a-z]' AND |
| | 213 | password ~ '[0-9]' AND |
| | 214 | password ~ '[^a-zA-Z0-9]' |
| | 215 | ) |
| | 216 | ); |
| | 217 | |
| | 218 | CREATE TABLE "Event_Happening_Rating" ( |
| | 219 | rating_id BIGSERIAL PRIMARY KEY, |
| | 220 | rating INT NOT NULL CHECK (rating BETWEEN 1 AND 10), |
| | 221 | comment TEXT, |
| | 222 | event_happening_id BIGINT NOT NULL, |
| | 223 | user_id BIGINT NOT NULL DEFAULT 0, |
| | 224 | |
| | 225 | CONSTRAINT fk_event_happening_rating_event_happening FOREIGN KEY (event_happening_id) REFERENCES "Event_Happening" (event_happening_id) |
| | 226 | ON DELETE CASCADE |
| | 227 | ON UPDATE CASCADE, |
| | 228 | CONSTRAINT fk_event_happening_rating_user FOREIGN KEY (user_id) REFERENCES "User" (user_id) |
| | 229 | ON DELETE SET DEFAULT |
| | 230 | ON UPDATE CASCADE, |
| | 231 | CONSTRAINT uq_rating_happening_user UNIQUE (event_happening_id, user_id) |
| | 232 | ); |
| | 233 | |
| | 234 | |
| | 235 | CREATE TABLE "Ticket" ( |
| | 236 | ticket_id BIGSERIAL PRIMARY KEY, |
| | 237 | ticket_type VARCHAR(50) NOT NULL, |
| | 238 | base_price FLOAT4 NOT NULL, |
| | 239 | is_available BOOLEAN NOT NULL DEFAULT TRUE, |
| | 240 | event_happening_id BIGINT NOT NULL, |
| | 241 | seat_id BIGINT NOT NULL, |
| | 242 | |
| | 243 | CONSTRAINT fk_ticket_event_happening FOREIGN KEY (event_happening_id) |
| | 244 | REFERENCES "Event_Happening" (event_happening_id) |
| | 245 | ON DELETE RESTRICT |
| | 246 | ON UPDATE CASCADE, |
| | 247 | CONSTRAINT fk_ticket_seat FOREIGN KEY (seat_id) |
| | 248 | REFERENCES "Seat" (seat_id) |
| | 249 | ON DELETE CASCADE |
| | 250 | ON UPDATE CASCADE, |
| | 251 | CONSTRAINT uq_ticket_event_happening_seat UNIQUE (event_happening_id, seat_id) |
| | 252 | ); |
| | 253 | |
| | 254 | CREATE TABLE "Ticket_Purchase" ( |
| | 255 | purchase_id BIGSERIAL PRIMARY KEY, |
| | 256 | ticket_id BIGINT NOT NULL, |
| | 257 | user_id BIGINT NOT NULL DEFAULT 0, |
| | 258 | qr_code VARCHAR(255) NOT NULL UNIQUE, |
| | 259 | purchase_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | 260 | purchase_amount FLOAT4 NOT NULL, |
| | 261 | |
| | 262 | CONSTRAINT fk_purchase_ticket FOREIGN KEY (ticket_id) REFERENCES "Ticket" (ticket_id) |
| | 263 | ON DELETE RESTRICT |
| | 264 | ON UPDATE CASCADE, |
| | 265 | CONSTRAINT fk_purchase_user FOREIGN KEY (user_id) REFERENCES "User" (user_id) |
| | 266 | ON DELETE SET DEFAULT |
| | 267 | ON UPDATE CASCADE |
| | 268 | ); |
| | 269 | |
| | 270 | CREATE TABLE "Ticket_Refund" ( |
| | 271 | refund_id BIGSERIAL PRIMARY KEY, |
| | 272 | purchase_id BIGINT NOT NULL UNIQUE, |
| | 273 | refund_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | 274 | refund_amount FLOAT4 NOT NULL, |
| | 275 | reason TEXT, |
| | 276 | |
| | 277 | CONSTRAINT fk_refund_purchase FOREIGN KEY (purchase_id) REFERENCES "Ticket_Purchase" (purchase_id) |
| | 278 | ON DELETE CASCADE |
| | 279 | ON UPDATE CASCADE |
| | 280 | ); |
| | 281 | |
| | 282 | ``` |
| | 283 | |