| 1 | CREATE TABLE countries (
|
|---|
| 2 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 3 | name TEXT NOT NULL,
|
|---|
| 4 | code TEXT UNIQUE,
|
|---|
| 5 | currency TEXT NOT NULL,
|
|---|
| 6 | language TEXT NOT NULL
|
|---|
| 7 | );
|
|---|
| 8 |
|
|---|
| 9 | CREATE TABLE regions (
|
|---|
| 10 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 11 | name TEXT NOT NULL,
|
|---|
| 12 | description TEXT,
|
|---|
| 13 | country_id INT NOT NULL,
|
|---|
| 14 | FOREIGN KEY (country_id) REFERENCES countries(id)
|
|---|
| 15 | );
|
|---|
| 16 |
|
|---|
| 17 | CREATE TABLE cities (
|
|---|
| 18 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 19 | name TEXT NOT NULL,
|
|---|
| 20 | population INT CHECK (population >= 0),
|
|---|
| 21 | region_id INT NOT NULL,
|
|---|
| 22 | FOREIGN KEY (region_id) REFERENCES regions(id)
|
|---|
| 23 | );
|
|---|
| 24 |
|
|---|
| 25 | CREATE TABLE coordinates (
|
|---|
| 26 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 27 | latitude DECIMAL(9,6) NOT NULL,
|
|---|
| 28 | longitude DECIMAL(9,6) NOT NULL
|
|---|
| 29 | );
|
|---|
| 30 |
|
|---|
| 31 | CREATE TABLE locations (
|
|---|
| 32 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 33 | name TEXT NOT NULL,
|
|---|
| 34 | description TEXT,
|
|---|
| 35 | location_type VARCHAR(100) NOT NULL,
|
|---|
| 36 | city_id INT NOT NULL,
|
|---|
| 37 | coordinate_id INT,
|
|---|
| 38 | FOREIGN KEY (city_id) REFERENCES cities(id) ,
|
|---|
| 39 | FOREIGN KEY (coordinate_id) REFERENCES coordinates(id) ON DELETE SET NULL
|
|---|
| 40 | );
|
|---|
| 41 |
|
|---|
| 42 | CREATE TABLE airports (
|
|---|
| 43 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 44 | name TEXT NOT NULL,
|
|---|
| 45 | code TEXT UNIQUE,
|
|---|
| 46 | location_id INT NOT NULL,
|
|---|
| 47 | FOREIGN KEY (location_id) REFERENCES locations(id)
|
|---|
| 48 | );
|
|---|
| 49 |
|
|---|
| 50 | CREATE TABLE transport_stations (
|
|---|
| 51 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 52 | name TEXT NOT NULL,
|
|---|
| 53 | station_type TEXT NOT NULL,
|
|---|
| 54 | location_id INT NOT NULL,
|
|---|
| 55 | FOREIGN KEY (location_id) REFERENCES locations(id)
|
|---|
| 56 | );
|
|---|
| 57 |
|
|---|
| 58 | CREATE TABLE user_roles (
|
|---|
| 59 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 60 | role_name VARCHAR(100) UNIQUE NOT NULL,
|
|---|
| 61 | description TEXT
|
|---|
| 62 | );
|
|---|
| 63 |
|
|---|
| 64 | CREATE TABLE users (
|
|---|
| 65 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 66 | email TEXT UNIQUE NOT NULL,
|
|---|
| 67 | username TEXT UNIQUE NOT NULL,
|
|---|
| 68 | password_hash TEXT NOT NULL,
|
|---|
| 69 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 70 | name TEXT NOT NULL,
|
|---|
| 71 | discount_percentage DECIMAL(5,2) DEFAULT 0 CHECK (discount_percentage BETWEEN 0 AND 100)
|
|---|
| 72 | );
|
|---|
| 73 |
|
|---|
| 74 | CREATE TABLE user_role_map (
|
|---|
| 75 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 76 | user_id INT NOT NULL,
|
|---|
| 77 | role_id INT NOT NULL,
|
|---|
| 78 | FOREIGN KEY (user_id) REFERENCES users(id) ,
|
|---|
| 79 | FOREIGN KEY (role_id) REFERENCES user_roles(id)
|
|---|
| 80 | );
|
|---|
| 81 |
|
|---|
| 82 | CREATE TABLE trips (
|
|---|
| 83 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 84 | name TEXT NOT NULL,
|
|---|
| 85 | description TEXT
|
|---|
| 86 | );
|
|---|
| 87 |
|
|---|
| 88 | CREATE TABLE trip_executions (
|
|---|
| 89 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 90 | trip_id INT NOT NULL,
|
|---|
| 91 | start_date DATE NOT NULL,
|
|---|
| 92 | end_date DATE NOT NULL,
|
|---|
| 93 | CHECK (end_date >= start_date),
|
|---|
| 94 | FOREIGN KEY (trip_id) REFERENCES trips(id)
|
|---|
| 95 | );
|
|---|
| 96 |
|
|---|
| 97 | CREATE TABLE trip_participants (
|
|---|
| 98 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 99 | trip_execution_id INT NOT NULL,
|
|---|
| 100 | user_id INT NOT NULL,
|
|---|
| 101 | passport_number TEXT,
|
|---|
| 102 | status TEXT DEFAULT 'pending',
|
|---|
| 103 | FOREIGN KEY (trip_execution_id) REFERENCES trip_executions(id) ,
|
|---|
| 104 | FOREIGN KEY (user_id) REFERENCES users(id)
|
|---|
| 105 | );
|
|---|
| 106 |
|
|---|
| 107 | CREATE TABLE facultatives (
|
|---|
| 108 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 109 | name TEXT NOT NULL,
|
|---|
| 110 | description TEXT,
|
|---|
| 111 | location_id INT NOT NULL,
|
|---|
| 112 | trip_participant_id INT NOT NULL,
|
|---|
| 113 | FOREIGN KEY (location_id) REFERENCES locations(id) ,
|
|---|
| 114 | FOREIGN KEY (trip_participant_id) REFERENCES trip_participants(id)
|
|---|
| 115 | );
|
|---|
| 116 |
|
|---|
| 117 | CREATE TABLE attractions (
|
|---|
| 118 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 119 | name TEXT NOT NULL,
|
|---|
| 120 | description TEXT,
|
|---|
| 121 | entry_fee DECIMAL(6,2) DEFAULT 0 CHECK (entry_fee >= 0),
|
|---|
| 122 | facultative_id INT NOT NULL,
|
|---|
| 123 | FOREIGN KEY (facultative_id) REFERENCES facultatives(id)
|
|---|
| 124 | );
|
|---|
| 125 |
|
|---|
| 126 | CREATE TABLE attraction_types (
|
|---|
| 127 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 128 | name TEXT UNIQUE NOT NULL,
|
|---|
| 129 | description TEXT
|
|---|
| 130 | );
|
|---|
| 131 |
|
|---|
| 132 | CREATE TABLE attraction_type_map (
|
|---|
| 133 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 134 | attraction_id INT NOT NULL,
|
|---|
| 135 | type_id INT NOT NULL,
|
|---|
| 136 | FOREIGN KEY (attraction_id) REFERENCES attractions(id) ,
|
|---|
| 137 | FOREIGN KEY (type_id) REFERENCES attraction_types(id)
|
|---|
| 138 | );
|
|---|
| 139 |
|
|---|
| 140 | CREATE TABLE hotels (
|
|---|
| 141 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 142 | name TEXT NOT NULL,
|
|---|
| 143 | star_rating INT CHECK (star_rating BETWEEN 1 AND 5),
|
|---|
| 144 | location_id INT NOT NULL,
|
|---|
| 145 | FOREIGN KEY (location_id) REFERENCES locations(id)
|
|---|
| 146 | );
|
|---|
| 147 |
|
|---|
| 148 | CREATE TABLE hotel_rooms (
|
|---|
| 149 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 150 | room_type TEXT NOT NULL,
|
|---|
| 151 | capacity INT CHECK (capacity > 0),
|
|---|
| 152 | price DECIMAL(6,2) CHECK (price >= 0),
|
|---|
| 153 | hotel_id INT NOT NULL,
|
|---|
| 154 | FOREIGN KEY (hotel_id) REFERENCES hotels(id)
|
|---|
| 155 | );
|
|---|
| 156 |
|
|---|
| 157 | CREATE TABLE hotel_trip_choices (
|
|---|
| 158 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 159 | hotel_id INT NOT NULL,
|
|---|
| 160 | trip_id INT NOT NULL,
|
|---|
| 161 | FOREIGN KEY (hotel_id) REFERENCES hotels(id) ,
|
|---|
| 162 | FOREIGN KEY (trip_id) REFERENCES trips(id)
|
|---|
| 163 | );
|
|---|
| 164 |
|
|---|
| 165 | CREATE TABLE trip_participants_hotel_rooms (
|
|---|
| 166 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 167 | trip_participant_id INT NOT NULL,
|
|---|
| 168 | hotel_room_id INT NOT NULL,
|
|---|
| 169 | check_in DATE,
|
|---|
| 170 | check_out DATE,
|
|---|
| 171 | CHECK (check_out >= check_in),
|
|---|
| 172 | FOREIGN KEY (trip_participant_id) REFERENCES trip_participants(id) ,
|
|---|
| 173 | FOREIGN KEY (hotel_room_id) REFERENCES hotel_rooms(id)
|
|---|
| 174 | );
|
|---|
| 175 |
|
|---|
| 176 | CREATE TABLE trip_locations (
|
|---|
| 177 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 178 | trip_id INT NOT NULL,
|
|---|
| 179 | location_id INT NOT NULL,
|
|---|
| 180 | visit_order INT CHECK (visit_order > 0),
|
|---|
| 181 | day_number INT CHECK (day_number > 0),
|
|---|
| 182 | FOREIGN KEY (trip_id) REFERENCES trips(id) ,
|
|---|
| 183 | FOREIGN KEY (location_id) REFERENCES locations(id)
|
|---|
| 184 | );
|
|---|
| 185 |
|
|---|
| 186 | CREATE TABLE flight_routes (
|
|---|
| 187 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 188 | from_airport_id INT NOT NULL,
|
|---|
| 189 | to_airport_id INT NOT NULL,
|
|---|
| 190 | CHECK (from_airport_id <> to_airport_id),
|
|---|
| 191 | FOREIGN KEY (from_airport_id) REFERENCES airports(id) ,
|
|---|
| 192 | FOREIGN KEY (to_airport_id) REFERENCES airports(id)
|
|---|
| 193 | );
|
|---|
| 194 |
|
|---|
| 195 | CREATE TABLE flight_bookings (
|
|---|
| 196 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 197 | trip_execution_id INT NOT NULL,
|
|---|
| 198 | trip_participant_id INT NOT NULL,
|
|---|
| 199 | flight_route_id INT NOT NULL,
|
|---|
| 200 | flight_number TEXT NOT NULL,
|
|---|
| 201 | price DECIMAL(8,2) CHECK (price >= 0),
|
|---|
| 202 | departure_datetime TIMESTAMP,
|
|---|
| 203 | arrival_datetime TIMESTAMP,
|
|---|
| 204 | FOREIGN KEY (trip_execution_id) REFERENCES trip_executions(id) ,
|
|---|
| 205 | FOREIGN KEY (trip_participant_id) REFERENCES trip_participants(id) ,
|
|---|
| 206 | FOREIGN KEY (flight_route_id) REFERENCES flight_routes(id)
|
|---|
| 207 | );
|
|---|
| 208 |
|
|---|
| 209 | CREATE TABLE transport_routes (
|
|---|
| 210 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 211 | distance DECIMAL(6,2) CHECK (distance >= 0),
|
|---|
| 212 | estimated_time INT CHECK (estimated_time > 0),
|
|---|
| 213 | from_station_id INT NOT NULL,
|
|---|
| 214 | to_station_id INT NOT NULL,
|
|---|
| 215 | FOREIGN KEY (from_station_id) REFERENCES transport_stations(id) ,
|
|---|
| 216 | FOREIGN KEY (to_station_id) REFERENCES transport_stations(id)
|
|---|
| 217 | );
|
|---|
| 218 |
|
|---|
| 219 | CREATE TABLE bus_bookings (
|
|---|
| 220 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 221 | trip_execution_id INT NOT NULL,
|
|---|
| 222 | trip_participant_id INT NOT NULL,
|
|---|
| 223 | route_id INT NOT NULL,
|
|---|
| 224 | bus_number TEXT,
|
|---|
| 225 | price DECIMAL(8,2) CHECK (price >= 0),
|
|---|
| 226 | FOREIGN KEY (trip_execution_id) REFERENCES trip_executions(id) ,
|
|---|
| 227 | FOREIGN KEY (trip_participant_id) REFERENCES trip_participants(id) ,
|
|---|
| 228 | FOREIGN KEY (route_id) REFERENCES transport_routes(id)
|
|---|
| 229 | );
|
|---|
| 230 |
|
|---|
| 231 | CREATE TABLE reviews (
|
|---|
| 232 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 233 | comment TEXT,
|
|---|
| 234 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 235 | trip_participant_id INT NOT NULL,
|
|---|
| 236 | rating INT CHECK (rating BETWEEN 1 AND 5),
|
|---|
| 237 | FOREIGN KEY (trip_participant_id) REFERENCES trip_participants(id)
|
|---|
| 238 | );
|
|---|
| 239 |
|
|---|
| 240 | CREATE TABLE photos_url (
|
|---|
| 241 | id BIGSERIAL PRIMARY KEY,
|
|---|
| 242 | url TEXT NOT NULL,
|
|---|
| 243 | uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|---|
| 244 | review_id INT NOT NULL,
|
|---|
| 245 | FOREIGN KEY (review_id) REFERENCES reviews(id)
|
|---|
| 246 | ); |
|---|