DatabaseCreation: BlinkBuyDDL.sql

File BlinkBuyDDL.sql, 18.3 KB (added by 231169, 14 hours ago)
Line 
1SET search_path TO myschema;
2
3-- 1. ОСНОВНИ ШИФРАРНИЦИ (Табели без надворешни зависности)
4CREATE TABLE ROLES (
5 role_id BIGSERIAL PRIMARY KEY,
6 role_name varchar(255) NOT NULL UNIQUE,
7 description varchar(255)
8);
9
10CREATE TABLE CATEGORIES (
11 category_id BIGSERIAL PRIMARY KEY,
12 category_name varchar(255) NOT NULL,
13 parent_category_id int8,
14 CONSTRAINT PARENT_OF FOREIGN KEY (parent_category_id) REFERENCES CATEGORIES (category_id) ON UPDATE Cascade ON DELETE Restrict
15);
16
17CREATE TABLE PRODUCT_ATTRIBUTES (
18 attribute_id BIGSERIAL PRIMARY KEY,
19 attribute_name varchar(255) NOT NULL
20);
21
22CREATE TABLE SHIPPING_METHODS (
23 method_id BIGSERIAL PRIMARY KEY,
24 method_name varchar(255) NOT NULL,
25 cost numeric(12, 2) NOT NULL CHECK (cost >= 0),
26 estimated_days int4 NOT NULL CHECK (estimated_days >= 0)
27);
28
29CREATE TABLE COUPONS (
30 coupon_id BIGSERIAL PRIMARY KEY,
31 code varchar(255) NOT NULL UNIQUE,
32 discount_value numeric(12, 2) NOT NULL CHECK (discount_value > 0),
33 discount_type varchar(255) NOT NULL,
34 valid_from timestamp with time zone NOT NULL,
35 valid_to timestamp with time zone NOT NULL,
36 min_order_value numeric(10, 2),
37 CONSTRAINT chk_coupons_valid_dates
38CHECK (valid_to >= valid_from)
39);
40
41CREATE TABLE MANUFACTURERS (
42 manufacturer_id BIGSERIAL PRIMARY KEY,
43 name varchar(100) NOT NULL,
44 contact_info text
45);
46
47-- 2. КОРИСНИЧКИ МОДУЛ
48CREATE TABLE USERS (
49 user_id BIGSERIAL PRIMARY KEY,
50 email varchar(255) NOT NULL UNIQUE CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'),
51 password_hash varchar(255) NOT NULL,
52 status varchar(255) NOT NULL,
53 created_at timestamp with time zone NOT NULL,
54 CONSTRAINT chk_users_status
55 CHECK (status IN (
56 'ACTIVE',
57 'INACTIVE',
58 'SUSPENDED',
59 'DELETED'
60 ))
61);
62
63CREATE TABLE USER_PROFILES (
64 profile_id BIGSERIAL PRIMARY KEY,
65 user_id int8 NOT NULL UNIQUE,
66 first_name varchar(255) NOT NULL,
67 last_name varchar(255) NOT NULL,
68 phone_number varchar(255) CHECK (phone_number IS NULL OR phone_number ~ '^\+?[0-9]{7,15}$'),
69 profile_picture_url varchar(255),
70 CONSTRAINT HAS_PROFILE FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade
71);
72
73CREATE TABLE ADDRESSES (
74 address_id BIGSERIAL PRIMARY KEY,
75 user_id int8 NOT NULL,
76 address_type varchar(255),
77 street_address varchar(255) NOT NULL,
78 city varchar(255) NOT NULL,
79 country varchar(255) NOT NULL,
80 is_default bool NOT NULL,
81 CONSTRAINT HAS_ADDRESS FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade
82);
83
84CREATE TABLE USER_ROLES (
85 user_id int8 NOT NULL,
86 role_id int8 NOT NULL,
87 assigned_at date NOT NULL,
88 PRIMARY KEY (user_id, role_id),
89 CONSTRAINT HAS_ROLE_ASSIGNMENT FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade,
90 CONSTRAINT IS_ASSIGNED_TO_USER FOREIGN KEY (role_id) REFERENCES ROLES (role_id) ON UPDATE Cascade ON DELETE Restrict
91);
92
93-- 3. КАТАЛОГ И ИНВЕНТАР
94CREATE TABLE PRODUCTS (
95 product_id BIGSERIAL PRIMARY KEY,
96 category_id int8 NOT NULL,
97 manufacturer_id int8 NOT NULL,
98 name varchar(255) NOT NULL,
99 brand varchar(255),
100 description text,
101 CONSTRAINT CONTAINS_PRODUCT FOREIGN KEY (category_id) REFERENCES CATEGORIES (category_id) ON UPDATE Cascade ON DELETE Restrict,
102 CONSTRAINT PRODUCED_BY FOREIGN KEY (manufacturer_id) REFERENCES MANUFACTURERS (manufacturer_id) ON UPDATE Cascade ON DELETE Restrict
103);
104
105CREATE TABLE PRODUCT_VARIANTS (
106 variant_id BIGSERIAL PRIMARY KEY,
107 product_id int8 NOT NULL,
108 manufacturer_id int8 NOT NULL,
109 sku varchar(100) NOT NULL UNIQUE,
110 price numeric(12, 2) NOT NULL CHECK (price >= 0),
111 stock_total int4 NOT NULL CHECK (stock_total >= 0),
112 CONSTRAINT HAS_VARIANT FOREIGN KEY (product_id) REFERENCES PRODUCTS (product_id) ON UPDATE Cascade ON DELETE Restrict,
113 CONSTRAINT V_PRODUCED_BY FOREIGN KEY (manufacturer_id) REFERENCES MANUFACTURERS (manufacturer_id) ON UPDATE Cascade ON DELETE Restrict
114);
115
116CREATE TABLE WAREHOUSES (
117 warehouse_id BIGSERIAL PRIMARY KEY,
118 warehouse_name varchar(255) NOT NULL,
119 location varchar(255),
120 user_id int8 NOT NULL, -- Сопственик (Seller)
121 CONSTRAINT OWNED_BY_SELLER FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Restrict
122);
123
124CREATE TABLE INVENTORY_ITEMS (
125 inventory_id BIGSERIAL PRIMARY KEY,
126 warehouse_id int8 NOT NULL,
127 variant_id int8 NOT NULL,
128 quantity int8 NOT NULL CHECK (quantity >= 0),
129 CONSTRAINT MANAGES_STOCK FOREIGN KEY (warehouse_id) REFERENCES WAREHOUSES (warehouse_id) ON UPDATE Cascade ON DELETE Restrict,
130 CONSTRAINT STOCKED_AS FOREIGN KEY (variant_id) REFERENCES PRODUCT_VARIANTS (variant_id) ON UPDATE Cascade ON DELETE Restrict
131);
132
133CREATE TABLE PRODUCT_INSTANCES (
134 instance_id BIGSERIAL PRIMARY KEY,
135 variant_id int8 NOT NULL,
136 warehouse_id int8 NOT NULL,
137 serial_number varchar(255) NOT NULL UNIQUE,
138 status varchar(20) NOT NULL,
139 CONSTRAINT LOCATED_IN FOREIGN KEY (warehouse_id) REFERENCES WAREHOUSES (warehouse_id) ON UPDATE Cascade ON DELETE Restrict,
140 CONSTRAINT HAS_INSTANCE FOREIGN KEY (variant_id) REFERENCES PRODUCT_VARIANTS (variant_id) ON UPDATE Cascade ON DELETE Restrict,
141 CONSTRAINT chk_product_instances_status
142 CHECK (status IN (
143 'AVAILABLE',
144 'RESERVED',
145 'SHIPPED',
146 'DELIVERED',
147 'RETURNED',
148 'DEFECTIVE'
149 ))
150);
151
152CREATE TABLE WARRANTIES (
153 warranty_id BIGSERIAL PRIMARY KEY,
154 instance_id int8 NOT NULL UNIQUE,
155 duration_months int8 NOT NULL,
156 terms_conditions text,
157 CONSTRAINT PROVIDES_WARANTY FOREIGN KEY (instance_id) REFERENCES PRODUCT_INSTANCES (instance_id) ON UPDATE Cascade ON DELETE Restrict,
158 CONSTRAINT chk_warranties_duration
159CHECK (duration_months > 0)
160);
161
162CREATE TABLE PRODUCT_ATTRIBUTE_VALUES (
163 variant_id int8 NOT NULL,
164 attribute_id int8 NOT NULL,
165 attr_value varchar(255) NOT NULL,
166 PRIMARY KEY (variant_id, attribute_id),
167 CONSTRAINT DEFINES_VALUE FOREIGN KEY (attribute_id) REFERENCES PRODUCT_ATTRIBUTES (attribute_id) ON UPDATE Cascade ON DELETE Restrict,
168 CONSTRAINT HAS_ATTRIBUTE_VALUES FOREIGN KEY (variant_id) REFERENCES PRODUCT_VARIANTS (variant_id) ON UPDATE Cascade ON DELETE Cascade
169);
170
171CREATE TABLE PRODUCT_PRICE_HISTORY (
172 history_id BIGSERIAL PRIMARY KEY,
173 variant_id int8 NOT NULL,
174 old_price numeric(12, 2) NOT NULL CHECK (old_price >= 0),
175 new_price numeric(12, 2) NOT NULL CHECK (new_price >= 0),
176 change_date timestamp with time zone NOT NULL,
177 CONSTRAINT HAS_PRICE_HISTORY FOREIGN KEY (variant_id) REFERENCES PRODUCT_VARIANTS (variant_id) ON UPDATE Cascade ON DELETE Restrict
178);
179
180-- 4. ПРОДАЖБА И ТРАНСАКЦИИ (Виртуелна кошничка логика)
181CREATE TABLE ORDERS (
182 order_id BIGSERIAL PRIMARY KEY,
183 user_id int8 NOT NULL,
184 shipping_method_id int8 NOT NULL, -- Секоја кошничка мора да има иницијален метод
185 order_date timestamp with time zone, -- NULL додека е во статус 'CART'
186 total_amount numeric(12, 2) CHECK (total_amount >= 0), -- NULL додека се полни
187 status varchar(255) NOT NULL, -- 'CART', 'PLACED', 'COMPLETED'
188 CONSTRAINT USED_FOR_ORDER FOREIGN KEY (shipping_method_id) REFERENCES SHIPPING_METHODS (method_id) ON UPDATE Cascade ON DELETE Restrict,
189 CONSTRAINT PLACES_ORDER FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Restrict,
190 CONSTRAINT chk_orders_status
191 CHECK (status IN (
192 'CART',
193 'PLACED',
194 'PAID',
195 'SHIPPED',
196 'COMPLETED',
197 'CANCELLED'
198 )),
199
200 CONSTRAINT chk_orders_cart_logic
201CHECK (
202 (status = 'CART' AND order_date IS NULL AND total_amount IS NULL)
203 OR
204 (status <> 'CART' AND order_date IS NOT NULL AND total_amount IS NOT NULL)
205 )
206);
207
208CREATE TABLE ORDER_ITEMS (
209 order_item_id BIGSERIAL PRIMARY KEY,
210 order_id int8 NOT NULL,
211 price_history_id int8 NOT NULL,
212 variant_id int8 NOT NULL,
213 quantity int4 NOT NULL CHECK (quantity > 0),
214 unit_price numeric(12, 2) NOT NULL CHECK (unit_price >= 0),
215 CONSTRAINT CONTAINS_ORDER_ITEM FOREIGN KEY (order_id) REFERENCES ORDERS (order_id) ON UPDATE Cascade ON DELETE Cascade,
216 CONSTRAINT IS_ORDERED_AS_ITEM FOREIGN KEY (variant_id) REFERENCES PRODUCT_VARIANTS (variant_id) ON UPDATE Cascade ON DELETE Restrict,
217 CONSTRAINT DEFINES_ORDER_ITEM_PRICE FOREIGN KEY (price_history_id) REFERENCES PRODUCT_PRICE_HISTORY (history_id) ON UPDATE Cascade ON DELETE Restrict
218);
219
220CREATE TABLE PAYMENTS (
221 payment_id BIGSERIAL PRIMARY KEY,
222 order_id int8 NOT NULL,
223 payment_method varchar(255) NOT NULL,
224 amount numeric(12, 2) NOT NULL CHECK (amount >= 0),
225 payment_status varchar(255) NOT NULL,
226 transaction_id varchar(255) NOT NULL UNIQUE,
227 payment_date timestamp with time zone NOT NULL,
228 CONSTRAINT HAS_PAYMENT_ATTEMPT FOREIGN KEY (order_id) REFERENCES ORDERS (order_id) ON UPDATE Cascade ON DELETE Restrict,
229 CONSTRAINT chk_payments_status
230 CHECK (payment_status IN (
231 'PENDING',
232 'SUCCESS',
233 'FAILED',
234 'REFUNDED'
235 ))
236);
237
238CREATE TABLE SHIPMENTS (
239 shipment_id BIGSERIAL PRIMARY KEY,
240 order_id int8 NOT NULL,
241 address_id int8 NOT NULL,
242 tracking_number varchar(255) UNIQUE,
243 shipped_date timestamp with time zone ,
244 estimated_arrival date ,
245 delivered_date timestamp with time zone,
246 courier_id int8 NOT NULL,
247 status VARCHAR(20) NOT NULL,
248 CONSTRAINT chk_shipments_status
249 CHECK (status IN (
250 'PENDING',
251 'PROCESSING',
252 'SHIPPED',
253 'IN_TRANSIT',
254 'DELIVERED',
255 'FAILED',
256 'RETURNED'
257 )),
258 CONSTRAINT chk_shipments_estimated_after_shipped
259 CHECK (
260 estimated_arrival IS NULL
261 OR shipped_date IS NULL
262 OR estimated_arrival >= shipped_date::date
263 ),
264 CONSTRAINT GENERATES_SHIPMENTS FOREIGN KEY (order_id) REFERENCES ORDERS (order_id) ON UPDATE Cascade ON DELETE Restrict,
265 CONSTRAINT IS_SHIPPED_TO FOREIGN KEY (address_id) REFERENCES ADDRESSES (address_id) ON UPDATE Cascade ON DELETE Restrict,
266 CONSTRAINT RESPONSIBLE_FOR_SHIPMENT FOREIGN KEY (courier_id) REFERENCES USERS (user_id),
267 CONSTRAINT chk_shipments_dates_tracking_by_status
268CHECK (
269 (
270 status IN ('PENDING', 'PROCESSING')
271 AND tracking_number IS NULL
272 AND shipped_date IS NULL
273 AND estimated_arrival IS NULL
274 AND delivered_date IS NULL
275 )
276 OR
277 (
278 status IN ('SHIPPED', 'IN_TRANSIT')
279 AND tracking_number IS NOT NULL
280 AND shipped_date IS NOT NULL
281 AND estimated_arrival IS NOT NULL
282 AND delivered_date IS NULL
283 )
284 OR
285 (
286 status = 'DELIVERED'
287 AND tracking_number IS NOT NULL
288 AND shipped_date IS NOT NULL
289 AND estimated_arrival IS NOT NULL
290 AND delivered_date IS NOT NULL
291 )
292 OR
293 (
294 status IN ('FAILED', 'RETURNED')
295 AND tracking_number IS NOT NULL
296 AND shipped_date IS NOT NULL
297 AND estimated_arrival IS NOT NULL
298 )
299)
300);
301
302CREATE TABLE SHIPMENT_ITEMS (
303 shipment_item_id int8 PRIMARY KEY, -- Референца кон ORDER_ITEM_ID
304 shipment_id int8 NOT NULL,
305 instance_id int8 NOT NULL,
306 quantity_shipped int4 NOT NULL DEFAULT 1,
307 CONSTRAINT chk_shipment_items_quantity
308 CHECK (quantity_shipped = 1),
309 CONSTRAINT CONTAINS_SHIPMENT_ITEM FOREIGN KEY (shipment_id) REFERENCES SHIPMENTS (shipment_id) ON UPDATE Cascade ON DELETE Cascade,
310 CONSTRAINT IS_SHIPPED_AS FOREIGN KEY (instance_id) REFERENCES PRODUCT_INSTANCES (instance_id) ON UPDATE Cascade ON DELETE Restrict,
311 CONSTRAINT IS_FULFILLED_IN_SHIPMENT FOREIGN KEY (shipment_item_id) REFERENCES ORDER_ITEMS (order_item_id)
312);
313
314CREATE TABLE ORDER_STATUS_HISTORY (
315 history_id BIGSERIAL PRIMARY KEY,
316 order_id int8 NOT NULL,
317 old_status varchar(255) NOT NULL,
318 new_status varchar(255) NOT NULL,
319 change_date timestamp with time zone NOT NULL,
320 CONSTRAINT HAS_STATUS_CHANGE FOREIGN KEY (order_id) REFERENCES ORDERS (order_id) ON UPDATE Cascade ON DELETE Restrict,
321 CONSTRAINT chk_order_status_history_old_status
322 CHECK (old_status IN (
323 'CART',
324 'PLACED',
325 'PAID',
326 'SHIPPED',
327 'COMPLETED',
328 'CANCELLED'
329 )),
330 CONSTRAINT chk_order_status_history_new_status
331 CHECK (new_status IN (
332 'CART',
333 'PLACED',
334 'PAID',
335 'SHIPPED',
336 'COMPLETED',
337 'CANCELLED'
338 ))
339);
340
341-- 5. МАРКЕТИНГ И ИНТЕРАКЦИЈА
342CREATE TABLE REVIEWS (
343 review_id BIGSERIAL PRIMARY KEY,
344 user_id int8 NOT NULL,
345 product_id int8 NOT NULL,
346 rating int4 NOT NULL CHECK (rating >= 1 AND rating <= 5),
347 comment_text text,
348 created_at timestamp with time zone NOT NULL,
349 CONSTRAINT HAS_REVIEW FOREIGN KEY (product_id) REFERENCES PRODUCTS (product_id) ON UPDATE Cascade ON DELETE Restrict,
350 CONSTRAINT WRITES_REVIEW FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Restrict
351);
352
353CREATE TABLE REVIEW_HELPFULNESS (
354 user_id int8 NOT NULL,
355 review_id int8 NOT NULL,
356 vote_type varchar(255) NOT NULL,
357 voted_at timestamp with time zone NOT NULL,
358 PRIMARY KEY (user_id, review_id),
359 CONSTRAINT MARKS_HELPFULL FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade,
360 CONSTRAINT RECIEVES_HELPFULL_VOTE FOREIGN KEY (review_id) REFERENCES REVIEWS (review_id) ON UPDATE Cascade ON DELETE Cascade,
361 CONSTRAINT chk_review_helpfulness_vote
362 CHECK (vote_type IN (
363 'HELPFUL',
364 'NOT_HELPFUL'
365 ))
366);
367
368CREATE TABLE LOYALTY_ACCOUNTS (
369 loyalty_account_id BIGSERIAL PRIMARY KEY,
370 user_id int8 NOT NULL UNIQUE,
371 current_balance int4 NOT NULL CHECK (current_balance >= 0),
372 last_updated timestamp with time zone NOT NULL,
373 CONSTRAINT HAS_LOYALTY_POINTS FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade
374);
375
376CREATE TABLE LOYALTY_HISTORY (
377 history_id BIGSERIAL PRIMARY KEY,
378 loyalty_account_id int8 NOT NULL,
379 order_id int8 NOT NULL,
380 payment_id int8 NOT NULL,
381 points_change int4 NOT NULL,
382 transaction_type varchar(50) NOT NULL,
383 description text,
384 created_at timestamp with time zone NOT NULL,
385 CONSTRAINT LOGS_BALANCE_CHANGE FOREIGN KEY (loyalty_account_id) REFERENCES LOYALTY_ACCOUNTS (loyalty_account_id),
386 CONSTRAINT REDEEMS_POINTS_ON_ORDER FOREIGN KEY (order_id) REFERENCES ORDERS (order_id),
387 CONSTRAINT EARNS_POINTS_BY_PAYMENT FOREIGN KEY (payment_id) REFERENCES PAYMENTS (payment_id),
388 CONSTRAINT chk_loyalty_transaction_type
389 CHECK (transaction_type IN (
390 'EARN',
391 'REDEEM',
392 'REFUND',
393 'ADJUSTMENT'
394 ))
395);
396
397CREATE TABLE WISHLISTS (
398 wishlist_id BIGSERIAL PRIMARY KEY,
399 user_id int8 NOT NULL UNIQUE,
400 created_at timestamp with time zone NOT NULL,
401 CONSTRAINT HAS_WISHLIST FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade
402);
403
404CREATE TABLE WISHLIST_ITEMS (
405 wishlist_id int8 NOT NULL,
406 variant_id int8 NOT NULL,
407 added_at timestamp with time zone NOT NULL,
408 PRIMARY KEY (wishlist_id, variant_id),
409 CONSTRAINT CONTAINS_WISHLIST_ITEM FOREIGN KEY (wishlist_id) REFERENCES WISHLISTS (wishlist_id) ON UPDATE Cascade ON DELETE Cascade,
410 CONSTRAINT IS_IN_WISHLIST FOREIGN KEY (variant_id) REFERENCES PRODUCT_VARIANTS (variant_id) ON UPDATE Cascade ON DELETE Cascade
411);
412
413CREATE TABLE PRODUCT_WAITLISTS (
414 waitlist_id BIGSERIAL PRIMARY KEY,
415 user_id int8 NOT NULL,
416 variant_id int8 NOT NULL,
417 added_at timestamp with time zone NOT NULL,
418 status varchar(255) NOT NULL,
419 CONSTRAINT uq_product_waitlist_user_variant UNIQUE (user_id, variant_id),
420 CONSTRAINT JOINS_WAITLIST FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade,
421 CONSTRAINT HAS_WAITLIST_ENTRY FOREIGN KEY (variant_id) REFERENCES PRODUCT_VARIANTS (variant_id) ON UPDATE Cascade ON DELETE Cascade,
422 CONSTRAINT chk_product_waitlists_status
423 CHECK (status IN (
424 'ACTIVE',
425 'NOTIFIED',
426 'REMOVED',
427 'FULFILLED'
428 ))
429
430);
431
432CREATE TABLE ORDER_DISCOUNTS (
433 order_id int8 NOT NULL,
434 coupon_id int8 NOT NULL,
435 applied_at timestamp with time zone NOT NULL,
436 amount_saved numeric(12, 2) NOT NULL CHECK (amount_saved >= 0),
437 PRIMARY KEY (order_id, coupon_id),
438 CONSTRAINT APPLIES_COUPON FOREIGN KEY (order_id) REFERENCES ORDERS (order_id) ON UPDATE Cascade ON DELETE Restrict,
439 CONSTRAINT IS_APPLIED_IN_ORDER FOREIGN KEY (coupon_id) REFERENCES COUPONS (coupon_id) ON UPDATE Cascade ON DELETE Restrict
440);
441
442-- 6. ОСТАНАТИ МОДУЛИ
443CREATE TABLE AUTH_LOGS (
444 log_id BIGSERIAL PRIMARY KEY,
445 user_id int8 NOT NULL,
446 login_timestamp timestamp with time zone NOT NULL,
447 ip_address varchar(45),
448 device_info varchar(255),
449 status varchar(255) NOT NULL,
450 CONSTRAINT GENERATES_AUTH_LOGS FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Restrict,
451 CONSTRAINT chk_auth_logs_status
452 CHECK (status IN (
453 'SUCCESS',
454 'FAILED'
455 ))
456);
457
458CREATE TABLE USER_SESSIONS (
459 session_id BIGSERIAL PRIMARY KEY,
460 user_id int8 NOT NULL,
461 session_token varchar(255) NOT NULL UNIQUE,
462 login_time timestamp with time zone NOT NULL,
463 expiry_time timestamp with time zone NOT NULL,
464 CONSTRAINT HAS_SESSION FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Restrict,
465 CONSTRAINT chk_user_sessions_expiry
466 CHECK (expiry_time > login_time)
467);
468
469CREATE TABLE USER_NOTIFICATIONS (
470 notification_id BIGSERIAL PRIMARY KEY,
471 user_id int8 NOT NULL,
472 type varchar(255) NOT NULL,
473 message varchar(255) NOT NULL,
474 sent_at timestamp with time zone NOT NULL,
475 CONSTRAINT RECIEVES_NOTIFICATIONS FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade
476);
477
478CREATE TABLE SUPPORT_TICKETS (
479 ticket_id BIGSERIAL PRIMARY KEY,
480 user_id int8 NOT NULL,
481 subject varchar(255) NOT NULL,
482 message_body text NOT NULL,
483 status varchar(255) NOT NULL,
484 priority varchar(255) NOT NULL,
485 CONSTRAINT CREATES_TICKET FOREIGN KEY (user_id) REFERENCES USERS (user_id) ON UPDATE Cascade ON DELETE Cascade,
486 CONSTRAINT chk_support_tickets_status
487CHECK (status IN (
488 'OPEN',
489 'IN_PROGRESS',
490 'RESOLVED',
491 'CLOSED'
492)),
493
494CONSTRAINT chk_support_tickets_priority
495CHECK (priority IN (
496 'LOW',
497 'MEDIUM',
498 'HIGH'
499))
500);