=== Евалуација == Примери на индекси Индекс врз колони што често се филтрираат: departure_date, return_date: {{{#!sql CREATE INDEX ind_flight_date_range ON Flights(departure_time, arrival_time); }}} Пример: {{{#!sql EXPLAIN ANALYZE SELECT * FROM Flights WHERE departure_time >= '2025-05-28' AND arrival_time < '2025-06-28'; }}} - EXPLAIN ANALYZE ја прикажува стратегијата на извршување и дали е користен индексот. - Овој индекс го забрзува пребарувањето на летови во даден временски интервал. Индекс за JOIN помеѓу Booking и Payment: {{{#!sql CREATE INDEX ind_payment_booking ON Payments(booking_id); }}} Пример: {{{#!sql EXPLAIN ANALYZE SELECT b.booking_id, p.amount, p.payment_method FROM Bookings b JOIN Payments p ON b.booking_id = p.booking_id WHERE b.booking_date >= '2025-01-01'; }}} - Планот за извршување ќе покаже дека индексот е употребен за побрзо наоѓање на поврзаните плаќања. == Тригери 1. Проверка за дупликат во Wishlist {{{#!sql CREATE OR REPLACE FUNCTION check_wishlist_entry() RETURNS TRIGGER AS $$ BEGIN IF EXISTS ( SELECT 1 FROM Wishlist WHERE user_id = NEW.user_id AND target_id = NEW.target_id ) THEN RAISE EXCEPTION 'Item already exists in wishlist!'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_wishlist_unique BEFORE INSERT ON Wishlist FOR EACH ROW EXECUTE FUNCTION check_wishlist_entry(); }}} - Го спречува додавањето на дупликат записи во Wishlist 2. Да се валидира нов корисник {{{#!sql CREATE OR REPLACE FUNCTION check_unique_email() RETURNS TRIGGER AS $$ BEGIN IF EXISTS ( SELECT 1 FROM Users WHERE email = NEW.email ) THEN RAISE EXCEPTION 'Email already registered!'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_unique_email BEFORE INSERT ON Users FOR EACH ROW EXECUTE FUNCTION check_unique_email(); }}} - Го спречува креирањето на корисници со дупликат емаил. 3. Превенција на креирање дупликат тикет за поддршка {{{#!sql CREATE OR REPLACE FUNCTION check_duplicate_ticket() RETURNS TRIGGER AS $$ BEGIN IF EXISTS ( SELECT 1 FROM SupportTickets WHERE user_id = NEW.user_id AND subject = NEW.subject AND status IN ('OPEN', 'RESOLVED') ) THEN RAISE EXCEPTION 'A similar ticket already exists!'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_duplicate_ticket BEFORE INSERT ON SupportTickets FOR EACH ROW EXECUTE FUNCTION check_duplicate_ticket(); }}} - Го одржува интегритетот на тикет системот и спречува повторно креирање на истиот проблем. == Погледи Пример на View за активни резервации: {{{ CREATE VIEW ActiveBookings AS SELECT b.booking_id, u.name, u.surname, f.flight_id, f.departure_time, f.arrival_time FROM Bookings b JOIN Users u ON b.user_id = u.user_id JOIN Flights f ON b.flight_id = f.flight_id WHERE f.departure_time >= CURRENT_DATE; }}} - Овој поглед ја поедноставува и забрзува анализата на активни резервации без повторување на JOIN операциите.