DatabaseCreation: phase2.sql

File phase2.sql, 6.8 KB (added by 231504, 5 days ago)
Line 
1CREATE 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
9CREATE 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
17CREATE 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
25CREATE TABLE coordinates (
26 id BIGSERIAL PRIMARY KEY,
27 latitude DECIMAL(9,6) NOT NULL,
28 longitude DECIMAL(9,6) NOT NULL
29);
30
31CREATE 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
42CREATE 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
50CREATE 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
58CREATE TABLE user_roles (
59 id BIGSERIAL PRIMARY KEY,
60 role_name VARCHAR(100) UNIQUE NOT NULL,
61 description TEXT
62);
63
64CREATE 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
74CREATE 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
82CREATE TABLE trips (
83 id BIGSERIAL PRIMARY KEY,
84 name TEXT NOT NULL,
85 description TEXT
86);
87
88CREATE 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
97CREATE 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
107CREATE 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
117CREATE 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
126CREATE TABLE attraction_types (
127 id BIGSERIAL PRIMARY KEY,
128 name TEXT UNIQUE NOT NULL,
129 description TEXT
130);
131
132CREATE 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
140CREATE 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
148CREATE 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
157CREATE 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
165CREATE 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
176CREATE 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
186CREATE 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
195CREATE 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
209CREATE 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
219CREATE 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
231CREATE 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
240CREATE 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);