Changes between Version 1 and Version 2 of DatabaseProgramming


Ignore:
Timestamp:
05/27/26 01:42:41 (3 hours ago)
Author:
231055
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v1 v2  
     1= DatabaseProgramming =
    12== Функции ==
     3=== fn_calculate_ride_price(p_driver_id, p_distance_km, p_discount_pct) ===
     4Функцијата ја пресметува финалната цена на вожњата врз основа на три влезни параметри: идентификаторот на возачот, изминатата дистанца во километри и опционален попуст во проценти (со default вредност 0). Внатрешно, таа ги пребарува табелите за сопственост на возила и ценовни правила за да ги извлече базичната цена и цената по километар според типот на возилото на тој возач — доколку возачот поседува повеќе возила, се зема поскапото. Ако возачот нема регистрирано возило, функцијата паѓа на Economy тарифа (80 + 40 МКД/км) и ја враќа финалната цена заокружена на 2 децимали.Оваа функција ја имплементира централната ценовна логика на апликацијата — секогаш кога корисникот бара вожња, системот мора да знае колку таа ќе чини пред да ја потврди, а таа пресметка зависи директно од тоа кое возило го вози возачот.
    25{{{#!sql
    36-- ============================================================
     
    5356-- Luxury возач, 10km, 10% попуст → (100 + 10*60) * 0.9 = 630.00
    5457SELECT fn_calculate_ride_price(7, 10, 10);
    55 
    56 
    57 
     58}}}
     59
     60=== fn_find_nearest_driver(p_pickup_location_id) ===
     61Функцијата прима ID на pickup локација, ги зема нејзините географски координати (latitude/longitude) и преку Haversine формулата го пресметува растојанието во метри до секој тековно активен и слободен возач. Резултатот е табела со еден ред — податоците за најблискиот возач: неговото ime, телефон, рејтинг, регистарска таблица, класа на возило и пресметаното растојание.
     62Оваа функција ја имплементира логиката за повржување на корисник со возач — наместо рачно пребарување, системот автоматски го наоѓа оној возач кој може најбрзо да стигне до корисникот, што е суштинска функционалност на секоја апликација за превоз.
     63
     64{{{#!sql
    5865-- ============================================================
    5966--  FUNCTION2: Наоѓа најблискиот слободен возач до pickup локацијата користејќи ги координатите (latitude/longitude).
     
    126133
    127134== Процедури ==
     135=== sp_request_ride(p_user_id, p_pickup_location_id, p_dropoff_location_id, p_distance_km, OUT p_ride_id) ===
     136Процедурата го организира целиот процес на барање вожња во еден повик. Таа прво ги валидира корисникот и двете локации, потоа автоматски пресметува попуст (10% за дистанци од 9+ km), ја повикува функцијата fn_find_nearest_driver за да го најде најблискиот слободен возач, ја повикува функцијата fn_calculate_ride_price за финалната цена и ја вметнува вожњата во табелата Rides со статус requested. На крај, испраќа нотификација до корисникот и го враќа ID-то на новосоздадената вожња преку OUT параметарот. Оваа процедура ја претставува главната влезна точка на апликацијата од страна на корисникот — секое притискање на копчето „Барај вожња" резултира токму со повик на оваа процедура, која ги поврзува сите деловни правила на едно место.
     137
    128138{{{#!sql
    129139-- ============================================================
     
    271281    RAISE NOTICE 'Новата вожња има ID: %', v_ride_id;
    272282END $$;
    273 
    274 
    275 
     283}}}
     284
     285=== sp_complete_ride(p_ride_id, p_payment_method) ===
     286Процедурата ја финализира вожњата: прво ги зема податоците за вожњата за да спречи race condition, го проверува дека вожњата е во статус in_progress или accepted, го валидира методот на плаќање (CASH или CARD), го менува статусот на completed, вметнува запис во табелата Payments и го ослободува возачот (is_available = true). Промената на статусот автоматски го активира тригерот за нотификации. Оваа процедура ја имплементира логиката на затворање на еден платежен циклус — осигурува дека плаќањето е регистрирано, возачот е достапен за следна вожња и корисникот добива потврда.
     287
     288{{{#!sql
    276289-- ============================================================
    277290--  PROCEDURE 2: sp_complete_ride
     
    371384
    372385== Tригери ==
     386=== trg_update_driver_rating ===
     387Тригерот се активира автоматски по секое ново вметнување во табелата Ratings. Функцијата (fn_update_driver_rating()) која ја повикува го пресметува новиот просечен рејтинг на возачот (ROUND на AVG од сите негови оценки) и го ажурира полето rating директно во табелата Drivers. Рејтингот на возачот е секогаш ажурен без потреба од рачно повикување, а корисниците и системот секогаш гледаат точна и актуелна оценка при изборот на возач.
     388
    373389{{{#!sql
    374390-- ============================================================
    375391--  TRIGGER1: автоматски го ажурира rating на возачот во Drivers табелата секој пат кога некој ќе додаде нов рејтинг во Ratings табелата.
    376392-- ============================================================
     393
    377394-- Прво правиме функција која тригерот ја повикува
    378395CREATE OR REPLACE FUNCTION fn_update_driver_rating()
     
    406423-- Погледни го рејтингот после → треба автоматски да се смени
    407424SELECT driver_id, rating FROM Drivers WHERE driver_id = 40;
    408 
     425}}}
     426=== trg_notify_on_ride_status_change ===
     427Тригерот се активира по секоја промена на полето status_id во табелата Rides (AFTER UPDATE OF status_id), само кога старата и новата вредност се различни. Функцијата (fn_notify_on_ride_status_change()) ја определува соодветнатa порака-ID според новиот статус (accepted, in_progress, completed, cancelled) и автоматски вметнува нов запис во табелата Notifications за корисникот на таа вожња. Овој тригер ја имплементира системот за real-time известувања — секоја промена во животниот циклус на вожњата (прифатена, возачот пристигна, завршена, откажана) автоматски генерира нотификација, без да е потребно тоа да се повикува експлицитно од секоја процедура поединечно.
     428
     429{{{#!sql
    409430-- ============================================================
    410431--  TRIGGER2:автоматски вметнува нотификација во Notifications кога се менува статусот на вожњата.