Changes between Version 1 and Version 2 of Евалуација
- Timestamp:
- 08/16/25 00:16:29 (4 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Евалуација
v1 v2 6 6 {{{#!sql 7 7 8 CREATE INDEX ind_flight_date_range ON flight(departure_date, return_date);8 CREATE INDEX ind_flight_date_range ON Flights(departure_time, arrival_time); 9 9 10 10 }}} 11 11 12 Пример - Овој индекс е корисен кога се филтрираат записи во табелата flights според колоната departure_date и return_date.12 Пример: 13 13 {{{#!sql 14 SELECT * FROM flights 15 WHERE departure_date >= '2025-05-28' AND return_date< '2026-05-28'; 14 EXPLAIN ANALYZE 15 SELECT * 16 FROM Flights 17 WHERE departure_time >= '2025-05-28' AND arrival_time < '2025-06-28'; 18 16 19 }}} 20 21 - EXPLAIN ANALYZE ја прикажува стратегијата на извршување и дали е користен индексот. 22 - Овој индекс го забрзува пребарувањето на летови во даден временски интервал. 17 23 18 24 Индекс за JOIN помеѓу Booking и Payment: 19 25 {{{#!sql 20 26 21 CREATE INDEX ind_payment_booking ON payment(bookingid);27 CREATE INDEX ind_payment_booking ON Payments(booking_id); 22 28 23 29 }}} 24 30 25 == Примери за тригери 26 27 1. Проверка дали одреден item веќе е во Wishlist 31 Пример: 28 32 {{{#!sql 29 33 30 CREATE OR REPLACE FUNCTION validate_wishlist_entry() 34 EXPLAIN ANALYZE 35 SELECT b.booking_id, p.amount, p.payment_method 36 FROM Bookings b 37 JOIN Payments p ON b.booking_id = p.booking_id 38 WHERE b.booking_date >= '2025-01-01'; 39 40 }}} 41 42 - Планот за извршување ќе покаже дека индексот е употребен за побрзо наоѓање на поврзаните плаќања. 43 44 == Тригери 45 46 1. Проверка за дупликат во Wishlist 47 {{{#!sql 48 49 CREATE OR REPLACE FUNCTION check_wishlist_entry() 31 50 RETURNS TRIGGER AS $$ 32 51 BEGIN 33 52 IF EXISTS ( 34 SELECT 1 FROM Wishlist 35 WHERE UserID = NEW.UserID AND TargetID = NEW.TargetID 53 SELECT 1 54 FROM Wishlist 55 WHERE user_id = NEW.user_id AND target_id = NEW.target_id 36 56 ) THEN 37 57 RAISE EXCEPTION 'Item already exists in wishlist!'; … … 40 60 END; 41 61 $$ LANGUAGE plpgsql; 42 CREATE TRIGGER check_wishlist_entry 62 63 CREATE TRIGGER trg_wishlist_unique 43 64 BEFORE INSERT ON Wishlist 44 65 FOR EACH ROW 45 EXECUTE FUNCTION validate_wishlist_entry();66 EXECUTE FUNCTION check_wishlist_entry(); 46 67 47 68 }}} 69 - Го спречува додавањето на дупликат записи во Wishlist 48 70 49 71 … … 51 73 {{{#!sql 52 74 53 CREATE OR REPLACE FUNCTION validate_new_user()75 CREATE OR REPLACE FUNCTION check_unique_email() 54 76 RETURNS TRIGGER AS $$ 55 77 BEGIN 56 IF EXISTS (SELECT 1 FROM application_user WHERE Email = NEW.Email) THEN 78 IF EXISTS ( 79 SELECT 1 FROM Users 80 WHERE email = NEW.email 81 ) THEN 57 82 RAISE EXCEPTION 'Email already registered!'; 58 END IF;59 IF LENGTH(NEW.Password) < 8 THEN60 RAISE EXCEPTION 'Password must be at least 8 characters long!';61 83 END IF; 62 84 RETURN NEW; 63 85 END; 64 86 $$ LANGUAGE plpgsql; 65 CREATE TRIGGER check_new_user 66 BEFORE INSERT ON application_user 87 88 CREATE TRIGGER trg_unique_email 89 BEFORE INSERT ON Users 67 90 FOR EACH ROW 68 EXECUTE FUNCTION validate_new_user();91 EXECUTE FUNCTION check_unique_email(); 69 92 70 93 }}} 94 - Го спречува креирањето на корисници со дупликат емаил. 71 95 72 96 3. Превенција на креирање дупликат тикет за поддршка 73 97 74 98 {{{#!sql 75 CREATE OR REPLACE FUNCTION prevent_duplicate_ticket() 99 100 CREATE OR REPLACE FUNCTION check_duplicate_ticket() 76 101 RETURNS TRIGGER AS $$ 77 102 BEGIN 78 103 IF EXISTS ( 79 SELECT 1 FROM SupportTicket 80 WHERE UserID = NEW.UserID81 AND Description = NEW.Description82 AND Status IN ('OPEN', 'RESOLVED')104 SELECT 1 FROM SupportTickets 105 WHERE user_id = NEW.user_id 106 AND subject = NEW.subject 107 AND status IN ('OPEN', 'RESOLVED') 83 108 ) THEN 84 RAISE EXCEPTION 'A similar issue has already been reported!';109 RAISE EXCEPTION 'A similar ticket already exists!'; 85 110 END IF; 86 111 RETURN NEW; 87 112 END; 88 113 $$ LANGUAGE plpgsql; 114 115 CREATE TRIGGER trg_duplicate_ticket 116 BEFORE INSERT ON SupportTickets 117 FOR EACH ROW 118 EXECUTE FUNCTION check_duplicate_ticket(); 119 89 120 }}} 121 - Го одржува интегритетот на тикет системот и спречува повторно креирање на истиот проблем. 90 122 91 123 92 124 == Погледи 125 Пример на View за активни резервации: 126 {{{ 127 CREATE VIEW ActiveBookings AS 128 SELECT b.booking_id, u.name, u.surname, f.flight_id, f.departure_time, f.arrival_time 129 FROM Bookings b 130 JOIN Users u ON b.user_id = u.user_id 131 JOIN Flights f ON b.flight_id = f.flight_id 132 WHERE f.departure_time >= CURRENT_DATE; 133 }}} 93 134 94 Views имаме креирано во фаза 2 135 - Овој поглед ја поедноставува и забрзува анализата на активни резервации без повторување на JOIN операциите.