Changes between Version 1 and Version 2 of DatabaseProgramming
- Timestamp:
- 05/27/26 01:42:41 (3 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
DatabaseProgramming
v1 v2 1 = DatabaseProgramming = 1 2 == Функции == 3 === fn_calculate_ride_price(p_driver_id, p_distance_km, p_discount_pct) === 4 Функцијата ја пресметува финалната цена на вожњата врз основа на три влезни параметри: идентификаторот на возачот, изминатата дистанца во километри и опционален попуст во проценти (со default вредност 0). Внатрешно, таа ги пребарува табелите за сопственост на возила и ценовни правила за да ги извлече базичната цена и цената по километар според типот на возилото на тој возач — доколку возачот поседува повеќе возила, се зема поскапото. Ако возачот нема регистрирано возило, функцијата паѓа на Economy тарифа (80 + 40 МКД/км) и ја враќа финалната цена заокружена на 2 децимали.Оваа функција ја имплементира централната ценовна логика на апликацијата — секогаш кога корисникот бара вожња, системот мора да знае колку таа ќе чини пред да ја потврди, а таа пресметка зависи директно од тоа кое возило го вози возачот. 2 5 {{{#!sql 3 6 -- ============================================================ … … 53 56 -- Luxury возач, 10km, 10% попуст → (100 + 10*60) * 0.9 = 630.00 54 57 SELECT 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 58 65 -- ============================================================ 59 66 -- FUNCTION2: Наоѓа најблискиот слободен возач до pickup локацијата користејќи ги координатите (latitude/longitude). … … 126 133 127 134 == Процедури == 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 128 138 {{{#!sql 129 139 -- ============================================================ … … 271 281 RAISE NOTICE 'Новата вожња има ID: %', v_ride_id; 272 282 END $$; 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 276 289 -- ============================================================ 277 290 -- PROCEDURE 2: sp_complete_ride … … 371 384 372 385 == Tригери == 386 === trg_update_driver_rating === 387 Тригерот се активира автоматски по секое ново вметнување во табелата Ratings. Функцијата (fn_update_driver_rating()) која ја повикува го пресметува новиот просечен рејтинг на возачот (ROUND на AVG од сите негови оценки) и го ажурира полето rating директно во табелата Drivers. Рејтингот на возачот е секогаш ажурен без потреба од рачно повикување, а корисниците и системот секогаш гледаат точна и актуелна оценка при изборот на возач. 388 373 389 {{{#!sql 374 390 -- ============================================================ 375 391 -- TRIGGER1: автоматски го ажурира rating на возачот во Drivers табелата секој пат кога некој ќе додаде нов рејтинг во Ratings табелата. 376 392 -- ============================================================ 393 377 394 -- Прво правиме функција која тригерот ја повикува 378 395 CREATE OR REPLACE FUNCTION fn_update_driver_rating() … … 406 423 -- Погледни го рејтингот после → треба автоматски да се смени 407 424 SELECT 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 409 430 -- ============================================================ 410 431 -- TRIGGER2:автоматски вметнува нотификација во Notifications кога се менува статусот на вожњата.
