DDL and DML: planora_ddl.sql

File planora_ddl.sql, 16.2 KB (added by 231035, 5 days ago)
Line 
1drop table if exists booking_amenities cascade;
2drop table if exists booking_discounts cascade;
3drop table if exists room_amenities cascade;
4drop table if exists property_amenities cascade;
5drop table if exists favorite_listings cascade;
6drop table if exists reviews cascade;
7drop table if exists payments cascade;
8drop table if exists bookings cascade;
9drop table if exists discounts cascade;
10drop table if exists availability_blocks cascade;
11drop table if exists images cascade;
12drop table if exists cancellation_policies cascade;
13drop table if exists notifications cascade;
14drop table if exists rooms cascade;
15drop table if exists room_types cascade;
16drop table if exists properties cascade;
17drop table if exists listing_types cascade;
18drop table if exists amenities cascade;
19drop table if exists payment_methods cascade;
20drop table if exists hosts cascade;
21drop table if exists guests cascade;
22drop table if exists admins cascade;
23drop table if exists host_applications cascade;
24drop table if exists users cascade;
25drop table if exists addresses cascade;
26drop table if exists countries cascade;
27
28
29create table countries (
30 country_id BIGSERIAL PRIMARY KEY,
31 country_name varchar(255) NOT NULL,
32 country_code varchar(10) NOT NULL,
33 CONSTRAINT uq_countries_country_code_ci UNIQUE (country_code)
34);
35
36create table addresses (
37 address_id BIGSERIAL PRIMARY KEY,
38 country_id BIGINT NOT NULL REFERENCES countries(country_id) ON DELETE RESTRICT ON UPDATE CASCADE,
39 zip_code varchar(50) NOT NULL ,
40 street varchar(100) NOT NULL,
41 city varchar(100) NOT NULL
42);
43create table users (
44 user_id BIGSERIAL PRIMARY KEY ,
45 email varchar(255) ,
46 password_hash varchar(255),
47 first_name varchar(255) ,
48 last_name varchar(255) ,
49 phone varchar(30) ,
50 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
51 updated_at TIMESTAMP,
52 CONSTRAINT uq_users_email_ci UNIQUE (email)
53);
54
55INSERT INTO users (user_id, email, password_hash, first_name, last_name)
56VALUES (-1, 'unknown@system.local', 'UNKNOWN_HASH', 'Unknown', 'User');
57
58
59create table admins (
60 admin_id BIGSERIAL PRIMARY KEY ,
61 user_id BIGINT NOT NULL UNIQUE default -1
62 REFERENCES users(user_id)
63 ON DELETE SET DEFAULT
64 ON UPDATE CASCADE
65);
66
67INSERT INTO admins (admin_id, user_id)
68VALUES (-1, -1);
69
70
71drop table if exists guests cascade ;
72create table guests (
73 guest_id BIGSERIAL PRIMARY KEY,
74 user_id BIGINT NOT NULL UNIQUE default -1
75 REFERENCES users(user_id)
76 ON DELETE SET DEFAULT
77 ON UPDATE CASCADE
78);
79INSERT INTO guests (guest_id, user_id)
80VALUES (-1, -1);
81
82create table host_applications (
83 application_id BIGSERIAL PRIMARY KEY,
84 user_id BIGINT NOT NULL UNIQUE REFERENCES users(user_id) ON DELETE SET DEFAULT ON UPDATE CASCADE,
85 application_date DATE NOT NULL DEFAULT CURRENT_DATE,
86 status varchar(50) NOT NULL,
87 reviewed_by_admin_id BIGINT REFERENCES admins(admin_id) ON DELETE SET DEFAULT ON UPDATE CASCADE,
88 review_date DATE,
89 rejection_reason text,
90 CONSTRAINT ck_host_application_status CHECK (
91 status IN ('PENDING', 'APPROVED', 'REJECTED', 'UNDER_REVIEW')
92 ),
93 CONSTRAINT ck_host_application_rejected_reason CHECK (
94 (status = 'REJECTED' AND rejection_reason IS NOT NULL)
95 OR status <> 'REJECTED'
96 ),
97 CONSTRAINT ck_host_application_reviewed CHECK (
98 (status IN ('APPROVED', 'REJECTED') AND reviewed_by_admin_id IS NOT NULL AND review_date IS NOT NULL)
99 OR status NOT IN ('APPROVED', 'REJECTED')
100 )
101);
102
103create table hosts (
104 user_id BIGINT PRIMARY KEY REFERENCES users(user_id) ON DELETE set default ON UPDATE CASCADE,
105 application_id BIGINT UNIQUE REFERENCES host_applications(application_id) ON DELETE SET DEFAULT ON UPDATE CASCADE
106);
107
108create table listing_types (
109 listing_type_id BIGSERIAL PRIMARY KEY,
110 type_name varchar(255) NOT NULL UNIQUE,
111 description text
112);
113
114create table payment_methods (
115 payment_method_id BIGSERIAL PRIMARY KEY,
116 method_name varchar(255) NOT NULL UNIQUE,
117 description text
118);
119
120create table amenities (
121 amenity_id BIGSERIAL PRIMARY KEY,
122 amenity_name varchar(100) NOT NULL,
123 amenity_type varchar(255) NOT NULL,
124 description text,
125 is_included BOOLEAN NOT NULL DEFAULT FALSE,
126 price NUMERIC(10,2),
127 CONSTRAINT ck_amenity_price_nonnegative CHECK (price IS NULL OR price >= 0)
128);
129
130create table properties (
131 property_id BIGSERIAL PRIMARY KEY,
132 host_id BIGINT NOT NULL REFERENCES hosts(user_id) ON DELETE set default ON UPDATE CASCADE,
133 listing_type_id BIGINT NOT NULL REFERENCES listing_types(listing_type_id) ON DELETE restrict ON UPDATE CASCADE,
134 address_id BIGINT NOT NULL REFERENCES addresses(address_id) ON DELETE RESTRICT ON UPDATE CASCADE,
135 title varchar(255) NOT NULL,
136 description text,
137 base_price NUMERIC(10,2) NOT NULL,
138 max_guests INTEGER NOT NULL,
139 status varchar(30) NOT NULL,
140 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
141 updated_at TIMESTAMP,
142 CONSTRAINT ck_property_price_nonnegative CHECK (base_price >= 0),
143 CONSTRAINT ck_property_max_guests_positive CHECK (max_guests > 0),
144 CONSTRAINT ck_property_status CHECK (
145 status IN ('DRAFT', 'ACTIVE', 'INACTIVE', 'ARCHIVED')
146 )
147);
148
149create table room_types (
150 room_type_id BIGSERIAL PRIMARY KEY,
151 type_name varchar(100) NOT NULL UNIQUE,
152 description text
153);
154
155create table rooms (
156 room_id BIGSERIAL PRIMARY KEY,
157 property_id BIGINT NOT NULL REFERENCES properties(property_id) ON DELETE CASCADE ON UPDATE CASCADE,
158 room_type_id BIGINT NOT NULL REFERENCES room_types(room_type_id) ON DELETE RESTRICT ON UPDATE CASCADE,
159 room_name varchar(100) NOT NULL,
160 capacity INTEGER NOT NULL,
161 price_per_night NUMERIC(10,2) NOT NULL,
162 description text,
163 status varchar(50) NOT NULL,
164 extra_capacity INTEGER NOT NULL DEFAULT 0,
165 extra_guest_price NUMERIC(10,2),
166 CONSTRAINT ck_room_capacity_positive CHECK (capacity > 0),
167 CONSTRAINT ck_room_extra_capacity_nonnegative CHECK (extra_capacity >= 0),
168 CONSTRAINT ck_room_price_nonnegative CHECK (price_per_night >= 0),
169 CONSTRAINT ck_room_extra_guest_price_nonnegative CHECK (
170 extra_guest_price IS NULL OR extra_guest_price >= 0
171 ),
172 CONSTRAINT ck_room_status CHECK (
173 status IN ('ACTIVE', 'INACTIVE', 'MAINTENANCE', 'UNAVAILABLE')
174 ),
175 CONSTRAINT uq_room_name_per_property UNIQUE (property_id, room_name)
176);
177
178create table availability_blocks (
179 availability_id BIGSERIAL PRIMARY KEY,
180 room_id BIGINT NOT NULL REFERENCES rooms(room_id) ON DELETE CASCADE ON UPDATE CASCADE,
181 blocked_from_date DATE NOT NULL,
182 blocked_to_date DATE NOT NULL,
183 blocked_from_time TIMESTAMP NOT NULL,
184 blocked_to_time TIMESTAMP NOT NULL,
185 description varchar(255),
186 CONSTRAINT ck_availability_date_range CHECK (blocked_to_date >= blocked_from_date),
187 CONSTRAINT ck_availability_time_range CHECK (blocked_to_time > blocked_from_time),
188 CONSTRAINT ck_availability_from_time_date CHECK (blocked_from_time::date = blocked_from_date),
189 CONSTRAINT ck_availability_to_time_date CHECK (blocked_to_time::date = blocked_to_date)
190);
191drop table if exists discounts cascade ;
192create table discounts (
193 discount_id BIGSERIAL PRIMARY KEY,
194 host_id BIGINT NOT NULL REFERENCES hosts(user_id) ON DELETE set default ON UPDATE CASCADE,
195 code varchar(255) NOT NULL,
196 title varchar(255) NOT NULL,
197 description text,
198 discount_type varchar(30) NOT NULL,
199 discount_value NUMERIC(10,2) NOT NULL,
200 valid_from DATE NOT NULL,
201 valid_to DATE NOT NULL,
202 is_active BOOLEAN NOT NULL DEFAULT TRUE,
203 CONSTRAINT uq_discounts_code_ci UNIQUE (code),
204 CONSTRAINT ck_discount_type CHECK (discount_type IN ('PERCENTAGE', 'FIXED')),
205 CONSTRAINT ck_discount_value_nonnegative CHECK (discount_value >= 0),
206 CONSTRAINT ck_discount_percentage_cap CHECK (
207 discount_type <> 'PERCENTAGE'
208 OR (discount_value >= 0 AND discount_value <= 100)
209 ),
210 CONSTRAINT ck_discount_fixed_positive CHECK (
211 discount_type <> 'FIXED' OR discount_value > 0
212 ),
213 CONSTRAINT ck_discount_valid_range CHECK (valid_to >= valid_from)
214);
215
216create table bookings (
217 booking_id BIGSERIAL PRIMARY KEY,
218 guest_id BIGINT NOT NULL REFERENCES guests(guest_id) ON DELETE set default ON UPDATE CASCADE,
219 room_id BIGINT NOT NULL REFERENCES rooms(room_id) ON DELETE restrict ON UPDATE CASCADE,
220 check_in_date DATE NOT NULL,
221 check_out_date DATE NOT NULL,
222 guests_count INTEGER NOT NULL,
223 total_price NUMERIC(10,2) NOT NULL,
224 booking_status varchar(30) NOT NULL,
225 booked_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
226 CONSTRAINT ck_booking_date_range CHECK (check_out_date > check_in_date),
227 CONSTRAINT ck_booking_guest_count_positive CHECK (guests_count > 0),
228 CONSTRAINT ck_booking_total_price_nonnegative CHECK (total_price >= 0),
229 CONSTRAINT ck_booking_status CHECK (
230 booking_status IN ('PENDING', 'CONFIRMED', 'CANCELLED', 'COMPLETED', 'NO_SHOW')
231 )
232);
233
234create table payments (
235 payment_id BIGSERIAL PRIMARY KEY,
236 booking_id BIGINT NOT NULL UNIQUE REFERENCES bookings(booking_id) ON DELETE restrict ON UPDATE CASCADE,
237 payment_method_id BIGINT NOT NULL REFERENCES payment_methods(payment_method_id) ON DELETE RESTRICT ON UPDATE CASCADE,
238 amount NUMERIC(10,2) NOT NULL,
239 payment_status varchar(30) NOT NULL,
240 paid_at TIMESTAMP,
241 CONSTRAINT ck_payment_amount_nonnegative CHECK (amount >= 0),
242 CONSTRAINT ck_payment_status CHECK (
243 payment_status IN ('PENDING', 'PAID', 'FAILED', 'REFUNDED', 'PARTIALLY_REFUNDED')
244 ),
245 CONSTRAINT ck_payment_paid_has_timestamp CHECK (
246 (payment_status = 'PAID' AND paid_at IS NOT NULL)
247 OR payment_status <> 'PAID'
248 )
249);
250create table reviews (
251 review_id BIGSERIAL PRIMARY KEY,
252 booking_id BIGINT NOT NULL UNIQUE REFERENCES bookings(booking_id) ON DELETE CASCADE ON UPDATE CASCADE,
253 guest_id BIGINT NOT NULL REFERENCES guests(guest_id) ON DELETE set default ON UPDATE CASCADE,
254 property_id BIGINT NOT NULL REFERENCES properties(property_id) ON DELETE CASCADE ON UPDATE CASCADE,
255 rating INTEGER NOT NULL,
256 comment text,
257 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
258 CONSTRAINT ck_review_rating CHECK (rating BETWEEN 1 AND 5)
259);
260
261create table favorite_listings (
262 favorite_id BIGSERIAL PRIMARY KEY,
263 user_id BIGINT NOT NULL REFERENCES users(user_id) ON DELETE cascade ON UPDATE CASCADE,
264 property_id BIGINT NOT NULL REFERENCES properties(property_id) ON DELETE cascade ON UPDATE CASCADE,
265 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
266 CONSTRAINT uq_favorite_listings_user_property UNIQUE (user_id, property_id)
267);
268
269create table notifications (
270 notification_id BIGSERIAL PRIMARY KEY,
271 user_id BIGINT NOT NULL REFERENCES users(user_id) ON DELETE set default ON UPDATE CASCADE,
272 message TEXT NOT NULL,
273 sent_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
274 is_read BOOLEAN NOT NULL DEFAULT FALSE
275);
276
277create table cancellation_policies (
278 policy_id BIGSERIAL PRIMARY KEY,
279 property_id BIGINT NOT NULL UNIQUE REFERENCES properties(property_id) ON DELETE CASCADE ON UPDATE CASCADE,
280 policy_name varchar(100) NOT NULL,
281 description TEXT,
282 refund_percentage INTEGER,
283 days_before_checking INTEGER,
284 CONSTRAINT ck_policy_refund_percentage CHECK (
285 refund_percentage IS NULL OR refund_percentage BETWEEN 0 AND 100
286 ),
287 CONSTRAINT ck_policy_days_nonnegative CHECK (
288 days_before_checking IS NULL OR days_before_checking >= 0
289 )
290);
291
292create table property_amenities (
293 property_id BIGINT NOT NULL REFERENCES properties(property_id) ON DELETE CASCADE ON UPDATE CASCADE,
294 amenity_id BIGINT NOT NULL REFERENCES amenities(amenity_id) ON DELETE CASCADE ON UPDATE CASCADE,
295 PRIMARY KEY (property_id, amenity_id)
296);
297
298create table room_amenities (
299 room_id BIGINT NOT NULL REFERENCES rooms(room_id) ON DELETE CASCADE ON UPDATE CASCADE,
300 amenity_id BIGINT NOT NULL REFERENCES amenities(amenity_id) ON DELETE CASCADE ON UPDATE CASCADE,
301 PRIMARY KEY (room_id, amenity_id)
302);
303
304
305create table booking_discounts (
306 booking_id BIGINT NOT NULL REFERENCES bookings(booking_id) ON DELETE CASCADE ON UPDATE CASCADE,
307 discount_id BIGINT NOT NULL REFERENCES discounts(discount_id) ON DELETE RESTRICT ON UPDATE CASCADE,
308 PRIMARY KEY (booking_id, discount_id)
309);
310
311create table booking_amenities (
312 booking_amenity_id BIGSERIAL PRIMARY KEY,
313 booking_id BIGINT NOT NULL REFERENCES bookings(booking_id) ON DELETE CASCADE ON UPDATE CASCADE,
314 amenity_id BIGINT NOT NULL REFERENCES amenities(amenity_id) ON DELETE RESTRICT ON UPDATE CASCADE,
315 quantity INTEGER NOT NULL DEFAULT 1,
316 CONSTRAINT uq_booking_amenities_booking_amenity UNIQUE (booking_id, amenity_id),
317 CONSTRAINT ck_booking_amenity_quantity_positive CHECK (quantity > 0)
318);
319
320create table images (
321 image_id BIGSERIAL PRIMARY KEY,
322 entity_type varchar(30) NOT NULL,
323 entity_id BIGINT NOT NULL,
324 property_id BIGINT REFERENCES properties(property_id) ON DELETE CASCADE ON UPDATE CASCADE,
325 room_id BIGINT REFERENCES rooms(room_id) ON DELETE CASCADE ON UPDATE CASCADE,
326 url varchar(255) NOT NULL,
327 alt_text varchar(255),
328 is_cover BOOLEAN NOT NULL DEFAULT FALSE,
329 sort_order INTEGER,
330 uploaded_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
331 CONSTRAINT ck_image_entity_type CHECK (entity_type IN ('PROPERTY', 'ROOM')),
332 CONSTRAINT ck_image_sort_order_nonnegative CHECK (sort_order IS NULL OR sort_order >= 0),
333 CONSTRAINT ck_image_exactly_one_owner CHECK (
334 (property_id IS NOT NULL AND room_id IS NULL AND entity_type = 'PROPERTY')
335 OR (property_id IS NULL AND room_id IS NOT NULL AND entity_type = 'ROOM')
336 ),
337 CONSTRAINT ck_image_entity_id_matches_owner CHECK (
338 (entity_type = 'PROPERTY' AND entity_id = property_id AND room_id IS NULL)
339 OR (entity_type = 'ROOM' AND entity_id = room_id AND property_id IS NULL)
340 )
341);
342------
343drop table if exists availability_windows cascade ;
344CREATE TABLE availability_windows (
345 availability_window_id BIGSERIAL PRIMARY KEY,
346 room_id BIGINT NOT NULL REFERENCES rooms(room_id)
347 ON DELETE CASCADE ON UPDATE CASCADE,
348 available_from_date DATE NOT NULL,
349 available_to_date DATE NOT NULL,
350 available_from_time TIMESTAMP NOT NULL,
351 available_to_time TIMESTAMP NOT NULL,
352 description VARCHAR(255),
353
354 CONSTRAINT ck_availability_window_date_range
355 CHECK (available_to_date >= available_from_date),
356
357 CONSTRAINT ck_availability_window_time_range
358 CHECK (available_to_time > available_from_time),
359
360 CONSTRAINT ck_availability_window_from_time_date
361 CHECK (available_from_time::date = available_from_date),
362
363 CONSTRAINT ck_availability_window_to_time_date
364 CHECK (available_to_time::date = available_to_date)
365);
366------
367COMMIT;