wiki:Евалуација

Евалуација

Примери на индекси

Индекс врз колони што често се филтрираат: departure_date, return_date:

CREATE INDEX ind_flight_date_range ON Flights(departure_time, arrival_time);

Пример:

EXPLAIN ANALYZE
SELECT *
FROM Flights
WHERE departure_time >= '2025-05-28' AND arrival_time < '2025-06-28';

  • EXPLAIN ANALYZE ја прикажува стратегијата на извршување и дали е користен индексот.
  • Овој индекс го забрзува пребарувањето на летови во даден временски интервал.

Индекс за JOIN помеѓу Booking и Payment:

CREATE INDEX ind_payment_booking ON Payments(booking_id);

Пример:

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
    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
  1. Да се валидира нов корисник
    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();
    
    
  • Го спречува креирањето на корисници со дупликат емаил.
  1. Превенција на креирање дупликат тикет за поддршка
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 операциите.
Last modified 4 days ago Last modified on 08/16/25 00:16:29
Note: See TracWiki for help on using the wiki.