Changes between Version 1 and Version 2 of Евалуација


Ignore:
Timestamp:
08/16/25 00:16:29 (4 days ago)
Author:
173067
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Евалуација

    v1 v2  
    66{{{#!sql
    77
    8 CREATE INDEX ind_flight_date_range ON flight(departure_date, return_date);
     8CREATE INDEX ind_flight_date_range ON Flights(departure_time, arrival_time);
    99
    1010}}}
    1111
    12 Пример - Овој индекс е корисен кога се филтрираат записи во табелата flights според колоната departure_date и return_date.
     12Пример:
    1313{{{#!sql
    14 SELECT * FROM flights
    15 WHERE departure_date >= '2025-05-28' AND return_date< '2026-05-28';
     14EXPLAIN ANALYZE
     15SELECT *
     16FROM Flights
     17WHERE departure_time >= '2025-05-28' AND arrival_time < '2025-06-28';
     18
    1619}}}
     20
     21- EXPLAIN ANALYZE ја прикажува стратегијата на извршување и дали е користен индексот.
     22- Овој индекс го забрзува пребарувањето на летови во даден временски интервал.
    1723
    1824Индекс за JOIN помеѓу Booking и Payment:
    1925{{{#!sql
    2026
    21 CREATE INDEX ind_payment_booking ON payment(bookingid);
     27CREATE INDEX ind_payment_booking ON Payments(booking_id);
    2228
    2329}}}
    2430
    25 == Примери за тригери
    26 
    27 1. Проверка дали одреден item веќе е во Wishlist
     31Пример:
    2832{{{#!sql
    2933
    30 CREATE OR REPLACE FUNCTION validate_wishlist_entry()
     34EXPLAIN ANALYZE
     35SELECT b.booking_id, p.amount, p.payment_method
     36FROM Bookings b
     37JOIN Payments p ON b.booking_id = p.booking_id
     38WHERE b.booking_date >= '2025-01-01';
     39
     40}}}
     41
     42- Планот за извршување ќе покаже дека индексот е употребен за побрзо наоѓање на поврзаните плаќања.
     43
     44== Тригери
     45
     461. Проверка за дупликат во Wishlist
     47{{{#!sql
     48
     49CREATE OR REPLACE FUNCTION check_wishlist_entry()
    3150RETURNS TRIGGER AS $$
    3251BEGIN
    3352   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
    3656   ) THEN
    3757       RAISE EXCEPTION 'Item already exists in wishlist!';
     
    4060END;
    4161$$ LANGUAGE plpgsql;
    42 CREATE TRIGGER check_wishlist_entry
     62
     63CREATE TRIGGER trg_wishlist_unique
    4364BEFORE INSERT ON Wishlist
    4465FOR EACH ROW
    45 EXECUTE FUNCTION validate_wishlist_entry();
     66EXECUTE FUNCTION check_wishlist_entry();
    4667
    4768}}}
     69- Го спречува додавањето на дупликат записи во Wishlist
    4870
    4971
     
    5173{{{#!sql
    5274
    53 CREATE OR REPLACE FUNCTION validate_new_user()
     75CREATE OR REPLACE FUNCTION check_unique_email()
    5476RETURNS TRIGGER AS $$
    5577BEGIN
    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
    5782       RAISE EXCEPTION 'Email already registered!';
    58    END IF;
    59    IF LENGTH(NEW.Password) < 8 THEN
    60        RAISE EXCEPTION 'Password must be at least 8 characters long!';
    6183   END IF;
    6284   RETURN NEW;
    6385END;
    6486$$ LANGUAGE plpgsql;
    65 CREATE TRIGGER check_new_user
    66 BEFORE INSERT ON application_user
     87
     88CREATE TRIGGER trg_unique_email
     89BEFORE INSERT ON Users
    6790FOR EACH ROW
    68 EXECUTE FUNCTION validate_new_user();
     91EXECUTE FUNCTION check_unique_email();
    6992
    7093}}}
     94- Го спречува креирањето на корисници со дупликат емаил.
    7195
    72963. Превенција на креирање дупликат тикет за поддршка
    7397
    7498{{{#!sql
    75 CREATE OR REPLACE FUNCTION prevent_duplicate_ticket()
     99
     100CREATE OR REPLACE FUNCTION check_duplicate_ticket()
    76101RETURNS TRIGGER AS $$
    77102BEGIN
    78103   IF EXISTS (
    79        SELECT 1 FROM SupportTicket
    80        WHERE UserID = NEW.UserID
    81        AND Description = NEW.Description
    82        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')
    83108   ) THEN
    84        RAISE EXCEPTION 'A similar issue has already been reported!';
     109       RAISE EXCEPTION 'A similar ticket already exists!';
    85110   END IF;
    86111   RETURN NEW;
    87112END;
    88113$$ LANGUAGE plpgsql;
     114
     115CREATE TRIGGER trg_duplicate_ticket
     116BEFORE INSERT ON SupportTickets
     117FOR EACH ROW
     118EXECUTE FUNCTION check_duplicate_ticket();
     119
    89120}}}
     121- Го одржува интегритетот на тикет системот и спречува повторно креирање на истиот проблем.
    90122
    91123
    92124== Погледи
     125Пример на View за активни резервации:
     126{{{
     127CREATE VIEW ActiveBookings AS
     128SELECT b.booking_id, u.name, u.surname, f.flight_id, f.departure_time, f.arrival_time
     129FROM Bookings b
     130JOIN Users u ON b.user_id = u.user_id
     131JOIN Flights f ON b.flight_id = f.flight_id
     132WHERE f.departure_time >= CURRENT_DATE;
     133}}}
    93134
    94 Views имаме креирано во фаза 2
     135- Овој поглед ја поедноставува и забрзува анализата на активни резервации без повторување на JOIN операциите.