DatabaseCreation: ddl.sql

File ddl.sql, 13.7 KB (added by 231012, 3 days ago)
Line 
1-- 1. User
2CREATE TABLE "User" (
3 user_id SERIAL PRIMARY KEY,
4 name VARCHAR(255) NOT NULL DEFAULT 'Unknown',
5 surname VARCHAR(255) NOT NULL DEFAULT 'Unknown',
6 email VARCHAR(255) UNIQUE,
7 telephone_num VARCHAR(20),
8 date_registration DATE,
9 type VARCHAR(10) NOT NULL,
10 ssn varchar(13) NOT NULL UNIQUE,
11 CHECK (length(trim(name)) > 0 AND length(trim(surname)) > 0),
12 CHECK (type IN ('guest', 'host')),
13 CHECK (date_registration <= CURRENT_DATE),
14 CHECK (email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
15);
16
17-- 2. Guest
18CREATE TABLE Guest (
19 UseruserId int4 PRIMARY KEY,
20 num_reservations int4 NOT NULL DEFAULT 0,
21 preference_type VARCHAR(100) NOT NULL,
22 FOREIGN KEY (UseruserId) REFERENCES "User"(user_id) ON DELETE CASCADE,
23 CHECK (num_reservations >= 0)
24);
25
26-- 3. Host
27CREATE TABLE Host (
28 UseruserId int4 PRIMARY KEY,
29 IBAN VARCHAR(34) NOT NULL,
30 average_score int4,
31 is_verified VARCHAR(3) NOT NULL DEFAULT 'no',
32 FOREIGN KEY (UseruserId) REFERENCES "User"(user_id) ON DELETE CASCADE,
33 CHECK (is_verified IN ('yes', 'no')),
34 CHECK (average_score BETWEEN 1 AND 5 OR average_score IS NULL),
35 CHECK (IBAN ~ '^[A-Z]{2}[0-9]{2}[A-Z0-9]{11,30}$')
36);
37
38-- 4. CampType
39CREATE TABLE CampType (
40 typeId SERIAL PRIMARY KEY,
41 type_name VARCHAR(100) NOT NULL UNIQUE,
42 description VARCHAR(255)
43);
44
45-- 5. CampLocation
46CREATE TABLE CampLocation (
47 campLocationId SERIAL PRIMARY KEY,
48 CampTypetypeId int4 NOT NULL,
49 name VARCHAR(255) NOT NULL,
50 description varchar(255),
51 type VARCHAR(20) NOT NULL,
52 max_guests int4 NOT NULL,
53 min_nights_stay int4 NOT NULL,
54 status VARCHAR(20) NOT NULL DEFAULT 'active',
55 season VARCHAR(20) NOT NULL,
56 opening_date DATE NOT NULL,
57 closing_date DATE NOT NULL,
58 FOREIGN KEY (CampTypetypeId) REFERENCES CampType(typeId) ON DELETE CASCADE,
59 CHECK (closing_date > opening_date),
60 CHECK (max_guests > 0),
61 CHECK (min_nights_stay > 0),
62 CHECK (status IN ('active', 'inactive', 'closed')),
63 CHECK (season IN ('spring', 'summer', 'autumn', 'winter', 'all')),
64 CHECK (type IN ('tent', 'cabin', 'bungalow')),
65 CHECK (length(trim(name)) > 0)
66);
67
68-- 6. Promotion
69CREATE TABLE Promotion (
70 promotionId SERIAL PRIMARY KEY,
71 HostUserUserId int4 NOT NULL,
72 promo_code VARCHAR(50) NOT NULL UNIQUE,
73 discount_percent int4 NOT NULL DEFAULT 0,
74 discount_amount NUMERIC(10,2) NOT NULL DEFAULT 0,
75 valid_from DATE NOT NULL,
76 valid_to DATE NOT NULL,
77 description varchar(255),
78 FOREIGN KEY (HostUserUserId) REFERENCES Host(UseruserId) ON DELETE CASCADE,
79 CHECK (valid_to >= valid_from),
80 CHECK (
81 (discount_percent>0 AND discount_amount = 0)
82 OR
83 (discount_amount>0 AND discount_percent = 0)
84 ),
85 CHECK (discount_percent BETWEEN 0 AND 100),
86 CHECK (discount_amount >= 0)
87);
88
89CREATE EXTENSION IF NOT EXISTS btree_gist;
90-- 7. Reservation
91CREATE TABLE Reservation (
92 reservationId SERIAL PRIMARY KEY,
93 GuestUseruserId int4,
94 PromotionpromotionId int4,
95 CampLocationcamplocationId int4 NOT NULL,
96 number_of_guests int4 NOT NULL,
97 reservation_status VARCHAR(20) NOT NULL DEFAULT 'pending',
98 check_in_date DATE NOT NULL,
99 check_out_date DATE NOT NULL,
100 created_at DATE NOT NULL DEFAULT CURRENT_DATE,
101 total_price NUMERIC(12,2) NOT NULL,
102 FOREIGN KEY (GuestUseruserId) REFERENCES Guest(UseruserId) ON DELETE SET NULL,
103 FOREIGN KEY (PromotionpromotionId) REFERENCES Promotion(promotionId) ON DELETE SET NULL,
104 FOREIGN KEY (CampLocationcamplocationId) REFERENCES CampLocation(campLocationId) ON DELETE RESTRICT,
105 CHECK (number_of_guests > 0),
106 CHECK (total_price >= 0),
107 CHECK (reservation_status IN ('pending', 'confirmed', 'cancelled', 'completed')),
108 CHECK (check_out_date > check_in_date),
109 CHECK (created_at <= check_in_date),
110 EXCLUDE USING gist (
111 CampLocationcamplocationId WITH =,
112 daterange(check_in_date, check_out_date, '[]') WITH &&
113 )
114);
115
116-- 8. Payment
117CREATE TABLE Payment (
118 paymentId SERIAL PRIMARY KEY,
119 ReservationreservationId int4 NOT NULL,
120 amount NUMERIC(12,2) NOT NULL,
121 payment_method VARCHAR(20) NOT NULL,
122 payment_date DATE NOT NULL,
123 transaction_reference VARCHAR(50),
124 payment_status VARCHAR(30) NOT NULL,
125 FOREIGN KEY (ReservationreservationId) REFERENCES Reservation(reservationId) ON DELETE RESTRICT,
126 CHECK (amount > 0),
127 CHECK (payment_method IN ('online','cash')),
128 CHECK (payment_status IN ('pending','completed','failed','refunded','partially_refunded')),
129 CHECK (payment_date <= CURRENT_DATE)
130);
131
132-- 9. ReservationStatus
133CREATE TABLE ReservationStatus (
134 statusReservationId SERIAL PRIMARY KEY,
135 ReservationreservationId int4 NOT NULL,
136 refund_amount NUMERIC(12,2) NOT NULL DEFAULT 0,
137 cancellation_date DATE,
138 FOREIGN KEY (ReservationreservationId) REFERENCES Reservation(reservationId) ON DELETE RESTRICT,
139 CHECK (refund_amount >= 0),
140 CHECK (cancellation_date IS NULL OR cancellation_date <= CURRENT_DATE)
141);
142
143-- 10. Activity
144CREATE TABLE Activity (
145 activity_id SERIAL PRIMARY KEY,
146 location_id int4 NOT NULL,
147 name VARCHAR(255) NOT NULL,
148 description varchar(255),
149 price_per_person int4 NOT NULL,
150 max_participants int4 NOT NULL,
151 duration_hours int4 NOT NULL,
152 difficulty_level int4,
153 equipment_provided varchar(255),
154 CHECK (price_per_person >= 0),
155 CHECK (max_participants > 0),
156 CHECK (duration_hours > 0),
157 CHECK (difficulty_level BETWEEN 1 AND 5 OR difficulty_level IS NULL)
158);
159
160-- 11. ReservationActivity
161CREATE TABLE ReservationActivity (
162 ReservationActivityId SERIAL PRIMARY KEY,
163 Activityactivity_id int4 NOT NULL,
164 ReservationreservationId int4 NOT NULL,
165 number_of_participants int4 NOT NULL,
166 total_price_for_activity NUMERIC(12,2) NOT NULL,
167 status VARCHAR(20),
168 booking_date DATE NOT NULL,
169 FOREIGN KEY (Activityactivity_id) REFERENCES Activity(activity_id) ON DELETE RESTRICT,
170 FOREIGN KEY (ReservationreservationId) REFERENCES Reservation(reservationId) ON DELETE RESTRICT,
171 CHECK (number_of_participants > 0),
172 CHECK (status IN ('booked','completed','cancelled')),
173 CHECK (booking_date <= CURRENT_DATE)
174);
175
176-- 12. ActivityReview
177CREATE TABLE ActivityReview (
178 activityReviewId SERIAL PRIMARY KEY,
179 GuestUseruserId int4,
180 Activityactivity_id int4 NOT NULL,
181 rating int4 NOT NULL,
182 comment varchar(255),
183 review_date DATE NOT NULL DEFAULT CURRENT_DATE,
184 FOREIGN KEY (GuestUseruserId) REFERENCES Guest(UseruserId) ON DELETE SET NULL,
185 FOREIGN KEY (Activityactivity_id) REFERENCES Activity(activity_id) ON DELETE CASCADE,
186 CHECK (rating BETWEEN 1 AND 5),
187 CHECK (review_date <= CURRENT_DATE)
188);
189
190-- 13. Review
191CREATE TABLE Review (
192 reviewId SERIAL PRIMARY KEY,
193 CampLocationcampLocationId int4 NOT NULL,
194 GuestUseruserId int4,
195 review_date DATE NOT NULL DEFAULT CURRENT_DATE,
196 comment varchar(255),
197 rating int4,
198 FOREIGN KEY (CampLocationcampLocationId) REFERENCES CampLocation(campLocationId) ON DELETE CASCADE,
199 FOREIGN KEY (GuestUseruserId) REFERENCES Guest(UseruserId) ON DELETE SET NULL,
200 CHECK (rating BETWEEN 1 AND 5),
201 CHECK (review_date <= CURRENT_DATE)
202);
203
204-- 14. EquipmentType
205CREATE TABLE EquipmentType (
206 EquipmentTypeId SERIAL PRIMARY KEY,
207 type_name VARCHAR(100) NOT NULL UNIQUE,
208 description VARCHAR(255)
209);
210
211-- 15. Equipment
212CREATE TABLE Equipment (
213 equipmentId SERIAL PRIMARY KEY,
214 EquipmentTypeEquipmentTypeId int4 NOT NULL,
215 CampLocationcampLocationId int4,
216 name VARCHAR(255) NOT NULL,
217 description varchar(255),
218 total_quantity int4 NOT NULL,
219 available_quantity int4 NOT NULL,
220 rental_price_per_day NUMERIC(10,2) NOT NULL,
221 deposit_amount NUMERIC(10,2) NOT NULL DEFAULT 0,
222 condition_status VARCHAR(20),
223 is_available VARCHAR(3) NOT NULL DEFAULT 'yes',
224 FOREIGN KEY (EquipmentTypeEquipmentTypeId) REFERENCES EquipmentType(EquipmentTypeId) ON DELETE CASCADE,
225 FOREIGN KEY (CampLocationcampLocationId) REFERENCES CampLocation(campLocationId) ON DELETE SET NULL,
226 CHECK (available_quantity <= total_quantity),
227 CHECK (total_quantity > 0 AND available_quantity >= 0),
228 CHECK (condition_status IN ('new','good','fair','poor','under_repair')),
229 CHECK (is_available IN ('yes','no')),
230 CHECK (deposit_amount >= 0)
231);
232
233-- 16. EquipmentRental
234CREATE TABLE EquipmentRental (
235 equipmentRentalId SERIAL PRIMARY KEY,
236 EquipmentequipmentId int4 NOT NULL DEFAULT 0,
237 ReservationreservationId int4,
238 quantity int4 NOT NULL,
239 start_date DATE NOT NULL,
240 end_date DATE NOT NULL,
241 total_price NUMERIC(12,2) NOT NULL,
242 deposit_paid NUMERIC(12,2) NOT NULL,
243 status VARCHAR(20) NOT NULL ,
244 FOREIGN KEY (EquipmentequipmentId) REFERENCES Equipment(equipmentId) ON DELETE SET DEFAULT,
245 FOREIGN KEY (ReservationreservationId) REFERENCES Reservation(reservationId) ON DELETE RESTRICT,
246 CHECK (quantity > 0),
247 CHECK (end_date > start_date),
248 CHECK (status IN ('active','returned','overdue','cancelled','damaged')),
249 CHECK (deposit_paid >= 0),
250 CHECK (total_price >= 0)
251);
252
253-- 17. Service
254CREATE TABLE Service (
255 serviceId SERIAL PRIMARY KEY,
256 service_name VARCHAR(100) NOT NULL,
257 description varchar(255),
258 additional_fee NUMERIC(10,2) NOT NULL
259);
260
261-- 18. Availability
262CREATE TABLE Availability (
263 availabilityId SERIAL PRIMARY KEY,
264 available_from_date DATE NOT NULL,
265 available_to_date DATE NOT NULL,
266 status VARCHAR(20) NOT NULL,
267 CHECK (available_to_date >= available_from_date)
268);
269
270-- 19. EmergencyContact
271CREATE TABLE EmergencyContact (
272 emergencyContactId SERIAL PRIMARY KEY,
273 CampLocationcampLocationId int4 NOT NULL,
274 contact_name VARCHAR(255) NOT NULL,
275 phone_number VARCHAR(20) NOT NULL,
276 created_at DATE NOT NULL,
277 FOREIGN KEY (CampLocationcampLocationId) REFERENCES CampLocation(campLocationId) ON DELETE CASCADE
278);
279
280-- 20. PriceHistory
281CREATE TABLE PriceHistory (
282 priceHistoryId SERIAL PRIMARY KEY,
283 CampLocationcampLocationId int4,
284 price_per_night NUMERIC(12,2) NOT NULL,
285 date_from DATE NOT NULL,
286 date_to DATE NOT NULL,
287 FOREIGN KEY (CampLocationcampLocationId) REFERENCES CampLocation(campLocationId) ON DELETE SET NULL,
288 CHECK (date_to >= date_from),
289 CHECK (price_per_night>=0)
290);
291
292-- 21. Message
293CREATE TABLE "Message" (
294 messageId SERIAL NOT NULL,
295 UseruserId int4 NOT NULL DEFAULT 0,
296 senderId int4 NOT NULL,
297 receiverId int4 NOT NULL,
298 content varchar(1500) NOT NULL,
299 sent_time time(7) NOT NULL,
300 PRIMARY KEY (messageId),
301 FOREIGN KEY (UseruserId) REFERENCES "User"(user_id) ON DELETE SET DEFAULT,
302 CHECK (senderId != receiverId),
303 CHECK (length(trim(content)) > 0)
304);
305
306
307-- 22. CampLocation - Host
308CREATE TABLE Host_Host (
309 CampLocationcampLocationId int4 NOT NULL,
310 HostUseruserid int4 NOT NULL,
311 PRIMARY KEY (CampLocationcampLocationId, HostUseruserid),
312 FOREIGN KEY (CampLocationcampLocationId) REFERENCES CampLocation(campLocationId) ON DELETE CASCADE,
313 FOREIGN KEY (HostUseruserid) REFERENCES Host(UseruserId) ON DELETE CASCADE
314);
315
316-- 23. CampLocation - Service
317CREATE TABLE camp_location_service (
318 ServiceserviceId int4 NOT NULL,
319 CampLocationcampLocationId int4 NOT NULL,
320 PRIMARY KEY (ServiceserviceId, CampLocationcampLocationId),
321 FOREIGN KEY (ServiceserviceId) REFERENCES Service(serviceId) ON DELETE CASCADE,
322 FOREIGN KEY (CampLocationcampLocationId) REFERENCES CampLocation(campLocationId) ON DELETE CASCADE
323);
324
325-- 24. Activity - CampLocation
326CREATE TABLE Activity_Activity (
327 Activityactivity_id2 int4 NOT NULL,
328 CampLocationcampLocationId int4 NOT NULL,
329 PRIMARY KEY (Activityactivity_id2, CampLocationcampLocationId),
330 FOREIGN KEY (Activityactivity_id2) REFERENCES Activity(activity_id) ON DELETE CASCADE,
331 FOREIGN KEY (CampLocationcampLocationId) REFERENCES CampLocation(campLocationId) ON DELETE CASCADE
332);
333
334-- 25. Guest Favorites
335CREATE TABLE Favorites (
336 favorite_id SERIAL PRIMARY KEY,
337 locationId int4 NOT NULL,
338 date_added DATE NOT NULL DEFAULT CURRENT_DATE
339
340);
341
342-- 26. Favorites_Guest_saves (old style - kept for compatibility if needed)
343CREATE TABLE Favorites_Guest_saves (
344 FavoritesfavoriteId int4 NOT NULL,
345 GuestUseruserId int4 NOT NULL,
346 PRIMARY KEY (FavoritesfavoriteId, GuestUseruserId),
347 FOREIGN KEY (FavoritesfavoriteId) REFERENCES Favorites(favorite_id) ON DELETE CASCADE,
348 FOREIGN KEY (GuestUseruserId) REFERENCES Guest(UseruserId) ON DELETE CASCADE
349);
350
351-- 27. User_Message_receiver
352CREATE TABLE user_message_receiver (
353 UseruserId int4 NOT NULL,
354 MessagemessageId int4 NOT NULL,
355 PRIMARY KEY (UseruserId, MessagemessageId),
356 FOREIGN KEY (UseruserId) REFERENCES "User"(user_id) ON DELETE CASCADE,
357 FOREIGN KEY (MessagemessageId) REFERENCES "Message"(messageId) ON DELETE CASCADE
358);
359
360
361--28.Availability_CampLocation_has
362CREATE TABLE Availability_CampLocation_has (
363 AvailabilityavailabilityId int4 NOT NULL,
364 CampLocationcampLocationId int4 NOT NULL,
365 PRIMARY KEY (AvailabilityavailabilityId, CampLocationcampLocationId),
366 FOREIGN KEY (AvailabilityavailabilityId) REFERENCES Availability(availabilityId) ON DELETE CASCADE,
367 FOREIGN KEY (CampLocationcampLocationId) REFERENCES CampLocation(campLocationId) ON DELETE CASCADE
368);
369
370ALTER TABLE "User"
371ADD CONSTRAINT ssn_length_check
372CHECK (length(ssn) = 13);
373
374ALTER TABLE Favorites
375ADD CONSTRAINT fk_favorites_camp
376FOREIGN KEY (locationId)
377REFERENCES CampLocation(campLocationId)
378ON DELETE CASCADE;