| 1 | CREATE TABLE Location (
|
|---|
| 2 | location_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 3 | city VARCHAR(100) NOT NULL,
|
|---|
| 4 | region VARCHAR(100),
|
|---|
| 5 | country VARCHAR(100) NOT NULL
|
|---|
| 6 | );
|
|---|
| 7 |
|
|---|
| 8 | CREATE TABLE Users (
|
|---|
| 9 | user_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 10 | email VARCHAR(150) UNIQUE NOT NULL,
|
|---|
| 11 | password_hash VARCHAR(255) NOT NULL,
|
|---|
| 12 | first_name VARCHAR(100),
|
|---|
| 13 | last_name VARCHAR(100),
|
|---|
| 14 | phone VARCHAR(30),
|
|---|
| 15 | registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 16 | account_status VARCHAR(30) DEFAULT 'PENDING',
|
|---|
| 17 | CHECK (email LIKE '%@%.%'),
|
|---|
| 18 | CHECK (account_status IN ('ACTIVE','INACTIVE','SUSPENDED','PENDING'))
|
|---|
| 19 | );
|
|---|
| 20 |
|
|---|
| 21 | CREATE TABLE Role (
|
|---|
| 22 | role_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 23 | role_name VARCHAR(50) UNIQUE NOT NULL
|
|---|
| 24 | );
|
|---|
| 25 |
|
|---|
| 26 | CREATE TABLE UserRole (
|
|---|
| 27 | user_id INTEGER NOT NULL,
|
|---|
| 28 | role_id INTEGER NOT NULL,
|
|---|
| 29 | PRIMARY KEY (user_id, role_id),
|
|---|
| 30 | FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
|
|---|
| 31 | FOREIGN KEY (role_id) REFERENCES Role(role_id) ON DELETE RESTRICT
|
|---|
| 32 | );
|
|---|
| 33 |
|
|---|
| 34 | CREATE TABLE Genre (
|
|---|
| 35 | genre_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 36 | genre_name VARCHAR(100) UNIQUE NOT NULL
|
|---|
| 37 | );
|
|---|
| 38 |
|
|---|
| 39 | CREATE TABLE ArtistType (
|
|---|
| 40 | artist_type_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 41 | type_name VARCHAR(100) UNIQUE NOT NULL,
|
|---|
| 42 | description TEXT
|
|---|
| 43 | );
|
|---|
| 44 |
|
|---|
| 45 | CREATE TABLE VenueType (
|
|---|
| 46 | venue_type_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 47 | name VARCHAR(100) UNIQUE NOT NULL,
|
|---|
| 48 | description TEXT
|
|---|
| 49 | );
|
|---|
| 50 |
|
|---|
| 51 | CREATE TABLE Venue (
|
|---|
| 52 | venue_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 53 | venue_type_id INTEGER NOT NULL,
|
|---|
| 54 | location_id INTEGER,
|
|---|
| 55 | venue_name VARCHAR(150) NOT NULL,
|
|---|
| 56 | address VARCHAR(255) NOT NULL,
|
|---|
| 57 | capacity INTEGER,
|
|---|
| 58 | indoor_outdoor VARCHAR(20),
|
|---|
| 59 | FOREIGN KEY (venue_type_id) REFERENCES VenueType(venue_type_id) ON DELETE RESTRICT,
|
|---|
| 60 | FOREIGN KEY (location_id) REFERENCES Location(location_id) ON DELETE SET NULL,
|
|---|
| 61 | CHECK (capacity IS NULL OR capacity > 0),
|
|---|
| 62 | CHECK (indoor_outdoor IN ('INDOOR','OUTDOOR','MIXED'))
|
|---|
| 63 | );
|
|---|
| 64 |
|
|---|
| 65 | CREATE TABLE PerformanceDurationOption (
|
|---|
| 66 | duration_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 67 | label VARCHAR(50) NOT NULL,
|
|---|
| 68 | duration_minutes INTEGER NOT NULL,
|
|---|
| 69 | CHECK (duration_minutes > 0)
|
|---|
| 70 | );
|
|---|
| 71 |
|
|---|
| 72 | CREATE TABLE ClientProfile (
|
|---|
| 73 | client_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 74 | user_id INTEGER UNIQUE NOT NULL,
|
|---|
| 75 | display_name VARCHAR(150),
|
|---|
| 76 | company_name VARCHAR(150),
|
|---|
| 77 | preferred_contact_method VARCHAR(50) DEFAULT 'EMAIL',
|
|---|
| 78 | location_id INTEGER,
|
|---|
| 79 | FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
|
|---|
| 80 | FOREIGN KEY (location_id) REFERENCES Location(location_id) ON DELETE SET NULL
|
|---|
| 81 | );
|
|---|
| 82 |
|
|---|
| 83 | CREATE TABLE Bookable (
|
|---|
| 84 | bookable_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 85 | bookable_type VARCHAR(20) NOT NULL,
|
|---|
| 86 | display_name VARCHAR(150) NOT NULL,
|
|---|
| 87 | description TEXT,
|
|---|
| 88 | base_price_from DECIMAL(10,2),
|
|---|
| 89 | average_rating DECIMAL(3,2),
|
|---|
| 90 | location_id INTEGER,
|
|---|
| 91 | is_active BOOLEAN DEFAULT TRUE,
|
|---|
| 92 | FOREIGN KEY (location_id) REFERENCES Location(location_id) ON DELETE SET NULL,
|
|---|
| 93 | CHECK (bookable_type IN ('ARTIST','BAND')),
|
|---|
| 94 | CHECK (average_rating IS NULL OR (average_rating >= 0 AND average_rating <= 5))
|
|---|
| 95 | );
|
|---|
| 96 |
|
|---|
| 97 | CREATE TABLE ArtistProfile (
|
|---|
| 98 | artist_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 99 | bookable_id INTEGER UNIQUE NOT NULL,
|
|---|
| 100 | user_id INTEGER UNIQUE NOT NULL,
|
|---|
| 101 | artist_type_id INTEGER NOT NULL,
|
|---|
| 102 | stage_name VARCHAR(150),
|
|---|
| 103 | biography TEXT,
|
|---|
| 104 | is_verified BOOLEAN DEFAULT FALSE,
|
|---|
| 105 | FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
|
|---|
| 106 | FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
|
|---|
| 107 | FOREIGN KEY (artist_type_id) REFERENCES ArtistType(artist_type_id) ON DELETE RESTRICT
|
|---|
| 108 | );
|
|---|
| 109 |
|
|---|
| 110 | CREATE TABLE BandProfile (
|
|---|
| 111 | band_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 112 | bookable_id INTEGER UNIQUE NOT NULL,
|
|---|
| 113 | owner_user_id INTEGER,
|
|---|
| 114 | band_name VARCHAR(150) NOT NULL,
|
|---|
| 115 | formation_year INTEGER,
|
|---|
| 116 | biography TEXT,
|
|---|
| 117 | FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
|
|---|
| 118 | FOREIGN KEY (owner_user_id) REFERENCES Users(user_id) ON DELETE SET NULL
|
|---|
| 119 | );
|
|---|
| 120 |
|
|---|
| 121 | CREATE TABLE BandMember (
|
|---|
| 122 | band_id INTEGER NOT NULL,
|
|---|
| 123 | artist_id INTEGER NOT NULL,
|
|---|
| 124 | PRIMARY KEY (band_id, artist_id),
|
|---|
| 125 | FOREIGN KEY (band_id) REFERENCES BandProfile(band_id) ON DELETE CASCADE,
|
|---|
| 126 | FOREIGN KEY (artist_id) REFERENCES ArtistProfile(artist_id) ON DELETE CASCADE
|
|---|
| 127 | );
|
|---|
| 128 |
|
|---|
| 129 | CREATE TABLE BookableGenre (
|
|---|
| 130 | bookable_id INTEGER NOT NULL,
|
|---|
| 131 | genre_id INTEGER NOT NULL,
|
|---|
| 132 | PRIMARY KEY (bookable_id, genre_id),
|
|---|
| 133 | FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
|
|---|
| 134 | FOREIGN KEY (genre_id) REFERENCES Genre(genre_id) ON DELETE CASCADE
|
|---|
| 135 | );
|
|---|
| 136 |
|
|---|
| 137 | CREATE TABLE PricingRule (
|
|---|
| 138 | pricing_rule_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 139 | bookable_id INTEGER NOT NULL,
|
|---|
| 140 | duration_id INTEGER NOT NULL,
|
|---|
| 141 | venue_type_id INTEGER,
|
|---|
| 142 | base_price DECIMAL(10,2) NOT NULL,
|
|---|
| 143 | valid_from TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 144 | valid_to TIMESTAMP,
|
|---|
| 145 | FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
|
|---|
| 146 | FOREIGN KEY (duration_id) REFERENCES PerformanceDurationOption(duration_id) ON DELETE RESTRICT,
|
|---|
| 147 | FOREIGN KEY (venue_type_id) REFERENCES VenueType(venue_type_id) ON DELETE SET NULL
|
|---|
| 148 | );
|
|---|
| 149 |
|
|---|
| 150 | CREATE TABLE AvailabilitySlot (
|
|---|
| 151 | slot_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 152 | bookable_id INTEGER NOT NULL,
|
|---|
| 153 | start_datetime TIMESTAMP NOT NULL,
|
|---|
| 154 | end_datetime TIMESTAMP NOT NULL,
|
|---|
| 155 | status VARCHAR(30) NOT NULL DEFAULT 'AVAILABLE',
|
|---|
| 156 | FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
|
|---|
| 157 | CHECK (end_datetime > start_datetime),
|
|---|
| 158 | CHECK (status IN ('AVAILABLE','BOOKED','BLOCKED'))
|
|---|
| 159 | );
|
|---|
| 160 |
|
|---|
| 161 | CREATE TABLE BookingRequest (
|
|---|
| 162 | request_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 163 | client_id INTEGER NOT NULL,
|
|---|
| 164 | duration_id INTEGER NOT NULL,
|
|---|
| 165 | event_type VARCHAR(100) NOT NULL,
|
|---|
| 166 | event_date DATE NOT NULL,
|
|---|
| 167 | location_id INTEGER,
|
|---|
| 168 | venue_id INTEGER,
|
|---|
| 169 | venue_type_id INTEGER,
|
|---|
| 170 | FOREIGN KEY (client_id) REFERENCES ClientProfile(client_id) ON DELETE CASCADE,
|
|---|
| 171 | FOREIGN KEY (duration_id) REFERENCES PerformanceDurationOption(duration_id) ON DELETE RESTRICT,
|
|---|
| 172 | FOREIGN KEY (location_id) REFERENCES Location(location_id) ON DELETE SET NULL,
|
|---|
| 173 | FOREIGN KEY (venue_id) REFERENCES Venue(venue_id) ON DELETE SET NULL,
|
|---|
| 174 | FOREIGN KEY (venue_type_id) REFERENCES VenueType(venue_type_id) ON DELETE SET NULL
|
|---|
| 175 | );
|
|---|
| 176 |
|
|---|
| 177 | CREATE TABLE Offer (
|
|---|
| 178 | offer_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 179 | request_id INTEGER NOT NULL,
|
|---|
| 180 | bookable_id INTEGER NOT NULL,
|
|---|
| 181 | duration_id INTEGER NOT NULL,
|
|---|
| 182 | total_price DECIMAL(10,2) NOT NULL,
|
|---|
| 183 | FOREIGN KEY (request_id) REFERENCES BookingRequest(request_id) ON DELETE CASCADE,
|
|---|
| 184 | FOREIGN KEY (bookable_id) REFERENCES Bookable(bookable_id) ON DELETE CASCADE,
|
|---|
| 185 | FOREIGN KEY (duration_id) REFERENCES PerformanceDurationOption(duration_id) ON DELETE RESTRICT
|
|---|
| 186 | );
|
|---|
| 187 |
|
|---|
| 188 | CREATE TABLE Booking (
|
|---|
| 189 | booking_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 190 | offer_id INTEGER UNIQUE NOT NULL,
|
|---|
| 191 | final_price DECIMAL(10,2) NOT NULL,
|
|---|
| 192 | booking_status VARCHAR(30) NOT NULL DEFAULT 'CREATED',
|
|---|
| 193 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 194 | FOREIGN KEY (offer_id) REFERENCES Offer(offer_id) ON DELETE RESTRICT,
|
|---|
| 195 | CHECK (booking_status IN ('CREATED','CONFIRMED','COMPLETED','CANCELLED'))
|
|---|
| 196 | );
|
|---|
| 197 |
|
|---|
| 198 | CREATE TABLE BookingStatusHistory (
|
|---|
| 199 | booking_status_history_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 200 | booking_id INTEGER NOT NULL,
|
|---|
| 201 | changed_by_user_id INTEGER,
|
|---|
| 202 | new_status VARCHAR(30) NOT NULL,
|
|---|
| 203 | changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 204 | FOREIGN KEY (booking_id) REFERENCES Booking(booking_id) ON DELETE CASCADE,
|
|---|
| 205 | FOREIGN KEY (changed_by_user_id) REFERENCES Users(user_id) ON DELETE SET NULL,
|
|---|
| 206 | CHECK (new_status IN ('CREATED','CONFIRMED','COMPLETED','CANCELLED'))
|
|---|
| 207 | );
|
|---|
| 208 |
|
|---|
| 209 | CREATE TABLE Payment (
|
|---|
| 210 | payment_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 211 | booking_id INTEGER NOT NULL,
|
|---|
| 212 | amount DECIMAL(10,2) NOT NULL,
|
|---|
| 213 | payment_status VARCHAR(30) NOT NULL DEFAULT 'PENDING',
|
|---|
| 214 | FOREIGN KEY (booking_id) REFERENCES Booking(booking_id) ON DELETE CASCADE,
|
|---|
| 215 | CHECK (payment_status IN ('PAID','PENDING','FAILED'))
|
|---|
| 216 | );
|
|---|
| 217 |
|
|---|
| 218 | CREATE TABLE Review (
|
|---|
| 219 | review_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 220 | booking_id INTEGER NOT NULL,
|
|---|
| 221 | rating INTEGER NOT NULL,
|
|---|
| 222 | comment TEXT,
|
|---|
| 223 | FOREIGN KEY (booking_id) REFERENCES Booking(booking_id) ON DELETE CASCADE,
|
|---|
| 224 | CHECK (rating BETWEEN 1 AND 5)
|
|---|
| 225 | );
|
|---|
| 226 |
|
|---|
| 227 | CREATE TABLE Message (
|
|---|
| 228 | message_id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|---|
| 229 | sender_user_id INTEGER,
|
|---|
| 230 | receiver_user_id INTEGER,
|
|---|
| 231 | request_id INTEGER,
|
|---|
| 232 | booking_id INTEGER,
|
|---|
| 233 | content TEXT NOT NULL,
|
|---|
| 234 | sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 235 | FOREIGN KEY (sender_user_id) REFERENCES Users(user_id) ON DELETE SET NULL,
|
|---|
| 236 | FOREIGN KEY (receiver_user_id) REFERENCES Users(user_id) ON DELETE SET NULL,
|
|---|
| 237 | FOREIGN KEY (request_id) REFERENCES BookingRequest(request_id) ON DELETE CASCADE,
|
|---|
| 238 | FOREIGN KEY (booking_id) REFERENCES Booking(booking_id) ON DELETE CASCADE
|
|---|
| 239 | ); |
|---|