Changes between Initial Version and Version 1 of QueryOptimization


Ignore:
Timestamp:
05/20/26 16:03:20 (5 days ago)
Author:
231198
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v1 v1  
     1=== VIEW 1: vw_active_driver_status ===
     2Опис на погледот (View): vw_active_driver_status
     3Овој поглед (View) служи како централизиран извор на информации за сите моментално активни возачи во системот. Тој ги спојува динамичките податоци за нивната моментална локација и достапност со статичките податоци за нивниот профил, возило и ценовна политика.
     4
     5Што прави овој поглед?
     6
     7Консолидација на податоци: Ги поврзува табелите active_drivers, drivers, locations, status, vehicle_ownership, vehicle_types, vehicles_model и pricing_rules.
     8
     9Филтрирање: Ги прикажува исклучиво возачите чиј статус е поставен како 'active'.
     10
     11Детализација: Обезбедува целосна слика за возачот – од неговиот рејтинг и контакт податоци, преку моменталната улица и населба каде што се наоѓа, па сè до спецификите на неговото возило (бренд, модел, боја, таблички) и соодветната тарифа (почетна цена и цена по километар) која се применува за тој тип на возило.
     12
     13Организација: Резултатите се подредени по идентификатор на возачот, што овозможува брз преглед и анализа на достапноста во реално време.
     14{{{#!sql
     15CREATE OR REPLACE VIEW vw_active_driver_status
     16            (driver_id, driver_name, driver_phone, driver_rating, is_available, working_start,
     17             current_location_id, grad, naselba, current_street, vehicle_plate, vehicle_color,
     18             vehicle_model, vehicle_class, vehicle_brand, base_price, price_per_km, driver_status)
     19AS
     20                        SELECT d.driver_id,
     21                                 d.name         AS driver_name,
     22                                 d.phone        AS driver_phone,
     23                                 d.rating       AS driver_rating,
     24                                 ad.is_available,
     25                                 ad.working_start,
     26                                 l.location_id  AS current_location_id,
     27                                 l.grad,
     28                                 l.naselba,
     29                                 l.ulica        AS current_street,
     30                                 vo.plate       AS vehicle_plate,
     31                                 vo.color       AS vehicle_color,
     32                                 vt.type_name   AS vehicle_model,
     33                                 vt.description AS vehicle_class,
     34                                 vm.model       AS vehicle_brand,
     35                                 pr.base_price,
     36                                 pr.price_per_km,
     37                                 s.status_text  AS driver_status
     38FROM active_drivers ad
     39         JOIN drivers d ON ad.driver_id = d.driver_id
     40         JOIN locations l ON ad.current_location_id = l.location_id
     41         JOIN status s ON d.status_id = s.status_id
     42         LEFT JOIN vehicle_ownership vo ON ad.vehicle_ownership_id = vo.vehicle_ownership_id
     43         LEFT JOIN vehicle_types vt ON vo.vehicle_type_id = vt.vehicle_type_id
     44         LEFT JOIN vehicles_model vm ON vt.vehicles_model_id = vm.vehicles_model_id
     45         LEFT JOIN pricing_rules pr ON vt.vehicle_type_id = pr.vehicle_type_id
     46WHERE s.status_text::text = 'active'::text
     47ORDER BY d.driver_id, pr.base_price DESC;
     48
     49select * from vw_active_driver_status;
     50}}}
     51
     52=== VIEW 2: vw_ride_details ===
     53Овој поглед овозможува целосна транспарентност и историски преглед на секое возење во системот. Тој ги агрегира сите клучни информации за едно возење во една единствена, лесно читлива табела, елиминирајќи ја потребата од комплексни JOIN операции при секое генерирање на извештај или пребарување.
     54
     55Што прави овој поглед?
     56
     57Релациска синтеза: Ги поврзува податоците за корисникот (Users), возачот (Drivers), возилото (Vehicle_ownership), локациите на поаѓање и пристигнување (Locations), како и статусот на возењето.
     58
     59Хронологија и перформанси: Обезбедува целосна временска секвенца на возењето (request, pickup, start, end_time), што е клучно за пресметка на времето на чекање и времетраењето на самото возење.
     60
     61Финансиска транспарентност: Ги вклучува деталите за поминатата дистанца, евентуалните попусти и конечната цена, олеснувајќи ја финансиската анализа.
     62
     63Географска прецизност: Ги детално ги прикажува координатите и адресните податоци за почетната и крајната дестинација.
     64
     65Оптимизација на перформансите:
     66Со цел да се обезбеди брзо пребарување на историјата на возењата, имплементирани се специфични индекси:
     67
     68idx_rides_user_id: Оптимизирање на пребарувањата за корисници (кога корисникот ја проверува својата лична историја на возења).
     69
     70idx_rides_driver_id: Оптимизирање на пребарувањата за возачи (кога возачот ја проверува својата работна историја).
     71
     72{{{#!sql
     73
     74CREATE OR REPLACE VIEW vw_ride_details AS
     75SELECT
     76    r.ride_id,
     77    -- Korisnik
     78    u.user_id,
     79    u.name                                  AS user_name,
     80    u.phone                                 AS user_phone,
     81
     82    -- Vozac
     83    d.driver_id,
     84    d.name                                  AS driver_name,
     85    d.phone                                 AS driver_phone,
     86    d.rating                                AS driver_rating,
     87
     88    -- Avto
     89    vo.plate       AS vehicle_plate,
     90    vo.color       AS vehicle_color,
     91    vt.type_name   AS vehicle_model,
     92    vt.description AS vehicle_class,
     93    vm.model       AS vehicle_brand,
     94
     95    -- Pickup lokacija
     96    lp.grad                                 AS pickup_grad,
     97    lp.naselba                              AS pickup_naselba,
     98    lp.ulica                                AS pickup_ulica,
     99    lp.broj                                 AS pickup_broj,
     100    lp.latitude                             AS pickup_lat,
     101    lp.longitude                            AS pickup_lng,
     102
     103    -- Dropoff lokacija
     104    ld.grad                                 AS dropoff_grad,
     105    ld.naselba                              AS dropoff_naselba,
     106    ld.ulica                                AS dropoff_ulica,
     107    ld.broj                                 AS dropoff_broj,
     108    ld.latitude                             AS dropoff_lat,
     109    ld.longitude                            AS dropoff_lng,
     110
     111    -- Vremijna sekvenca
     112    r.request_time,
     113    r.pickup_time,
     114    r.start_time,
     115    r.end_time,
     116
     117    -- Cena i distanca
     118    r.distance_km,
     119    r.discount_percentage,
     120    r.final_price,
     121
     122    -- Status na voznata
     123    s.status_text                           AS ride_status
     124
     125FROM Rides r
     126         LEFT JOIN Users u        ON r.user_id                = u.user_id
     127         LEFT JOIN Drivers d      ON r.driver_id              = d.driver_id
     128         JOIN Locations lp   ON r.pickup_location_id     = lp.location_id
     129         JOIN Locations ld   ON r.dropoff_location_id    = ld.location_id
     130         JOIN Status s       ON r.status_id              = s.status_id
     131         LEFT JOIN vehicle_ownership vo ON r.vehicle_ownership_id = vo.vehicle_ownership_id
     132         LEFT JOIN vehicle_types vt ON vo.vehicle_type_id = vt.vehicle_type_id
     133         LEFT JOIN vehicles_model vm ON vt.vehicles_model_id = vm.vehicles_model_id
     134;
     135
     136select * from vw_ride_details;
     137
     138
     139select * from vw_ride_details where user_id = 1;
     140CREATE INDEX idx_rides_user_id
     141    ON rides(user_id DESC NULLS LAST);
     142
     143   
     144select * from vw_ride_details where driver_id=56;
     145CREATE INDEX idx_rides_driver_id
     146        ON rides(driver_id DESC NULLS LAST);
     147   
     148DROP INDEX idx_rides_user_id;
     149DROP INDEX idx_rides_driver_id;
     150}}}
     151
     152
     153== VIEW 3: vw_payment_history ==
     154Овој поглед претставува централен регистар на сите финансиски трансакции во рамките на такси апликацијата. Тој овозможува брз преглед на тоа кој, колку и на кој начин платил за конкретно возење, вклучувајќи ги и пресметките за попусти.
     155
     156Што прави овој поглед?
     157
     158Финансиска анализа: Ги поврзува табелите Payments, Rides и Payment_methods за да даде јасен увид во начинот на плаќање (готовина или картичка) и статусот на трансакцијата (дали е успешна, неуспешна или рефундирана).
     159
     160Пресметка на вредност: Покрај конечниот износ (amount), погледот динамички го пресметува износот пред попустот (amount_before_discount), што е од суштинско значење за сметководствени извештаи и евалуација на маркетинг кампањите.
     161
     162Контекстуални информации: За секоја уплата, погледот автоматски ги повлекува деталите за корисникот, возачот, траекторијата на возењето (адреси) и брендот на користеното возило.
     163
     164Статусна транспарентност: Ги комбинира статусот на плаќањето (payment_status) и статусот на самото возење (ride_status), што овозможува откривање на неконзистентности во системот.
     165
     166Оптимизација на перформансите
     167За да се забрза пребарувањето на големиот број трансакции во базата, дефинирани се индекси за оптимизација:
     168
     169idx_payments_ride_id: Оптимизира пристап до плаќањето преку идентификаторот на возењето (честа операција при проверка на детали за конкретен налог).
     170
     171idx_payments_date: Оптимизира филтрирање на уплати по временски периоди (на пр. дневни, месечни или годишни финансиски извештаи).
     172
     173{{{#!sql
     174CREATE OR REPLACE VIEW vw_payment_history AS
     175SELECT
     176    p.payment_id,
     177
     178    -- Korisnik
     179    u.user_id,
     180    u.name                                  AS user_name,
     181    u.phone                                 AS user_phone,
     182
     183    -- Ride info
     184    r.ride_id,
     185    r.request_time                          AS ride_requested_at,
     186    r.start_time                            AS ride_started_at,
     187    r.end_time                              AS ride_ended_at,
     188    r.distance_km,
     189
     190    -- Adresa kratko
     191    lp.naselba  || ' - ' ||
     192    lp.ulica    || ' '   || lp.broj         AS pickup_address,
     193
     194    ld.naselba  || ' - ' ||
     195    ld.ulica    || ' '   || ld.broj         AS dropoff_address,
     196
     197    -- Vozac
     198    d.driver_id,
     199    d.name                                  AS driver_name,
     200
     201    -- Avto
     202    vo.plate       AS vehicle_plate,
     203    vt.type_name   AS vehicle_model,
     204    vt.description AS vehicle_class,
     205    vm.model       AS vehicle_brand,
     206
     207    -- Plakjanje
     208    p.amount,
     209    p.payment_time,
     210    pm.payment_tip                          AS payment_method,  -- CASH / CARD
     211
     212    -- Originalna cena pred popust
     213    ROUND(
     214            p.amount / NULLIF(1.0 - r.discount_percentage / 100.0, 0)
     215                ::numeric, 2)                           AS amount_before_discount,
     216
     217    r.discount_percentage,
     218
     219    -- Statusi
     220    sp.status_text                          AS payment_status,
     221    sr.status_text                          AS ride_status
     222
     223FROM Payments p
     224         JOIN Rides r            ON p.ride_id                    = r.ride_id
     225         JOIN Users u            ON r.user_id                    = u.user_id
     226         JOIN Drivers d          ON r.driver_id                  = d.driver_id
     227         JOIN Payment_methods pm ON p.payment_method_id          = pm.payment_method_id
     228         JOIN Status sp          ON p.status_id                  = sp.status_id
     229         JOIN Status sr          ON r.status_id                  = sr.status_id
     230         JOIN Locations lp       ON r.pickup_location_id         = lp.location_id
     231         JOIN Locations ld       ON r.dropoff_location_id        = ld.location_id
     232         LEFT JOIN vehicle_ownership vo ON r.vehicle_ownership_id = vo.vehicle_ownership_id
     233         LEFT JOIN vehicle_types vt ON vo.vehicle_type_id = vt.vehicle_type_id
     234         LEFT JOIN vehicles_model vm ON vt.vehicles_model_id = vm.vehicles_model_id
     235
     236;
     237
     238select * from vw_payment_history;
     239
     240select * from vw_payment_history where user_id = 2267;
     241CREATE INDEX idx_payments_ride_id
     242    ON payments(ride_id DESC NULLS LAST);
     243
     244select * from vw_payment_history where DATE(payment_time) = '2025-10-02';
     245CREATE INDEX idx_payments_date
     246    ON payments(DATE(payment_time));
     247   
     248DROP INDEX idx_payments_ride_id;
     249DROP INDEX idx_payments_date;
     250}}}
     251
     252== VIEW 4: vw_driver_profile ==
     253Овој поглед е оптимизиран за апликации од типот „Барање на возило во близина“. Неговата главна улога е да креира профил на возачите кои се во моментов достапни за примање на нови патници, филтрирајќи ги само оние што се активни и слободни во системот.
     254
     255Што прави овој поглед?
     256
     257Реална достапност: Погледот ги поврзува табелите Drivers со Active_drivers и применува филтрирање (WHERE s.status_text = 'active' AND ad.is_available IS TRUE), обезбедувајќи листа што содржи само возачи кои можат веднаш да се ангажираат.
     258
     259Локациска свесност: Ги вклучува моменталните географски координати и адресата (град, населба, улица) на возачот, што е неопходно за алгоритмите кои пресметуваат кој возач е најблиску до корисникот.
     260
     261Профилирање на возило: Обезбедува детални технички спецификации за возилото што возачот го управува во моментот (таблички, боја, година, бренд и класа), овозможувајќи му на корисникот да го препознае возилото при пристигнувањето.
     262
     263Економски параметри: Ја прикажува тарифата (базна цена и цена по километар) која е специфична за типот на возило на возачот, овозможувајќи транспарентна пресметка на потенцијалното возење уште пред неговото започнување.
     264
     265Технички прибелешки
     266Релациска структура: Користи LEFT JOIN за поголемиот дел од поврзувањата (возила, локации), што осигурува дека профилот на возачот ќе биде генериран дури и ако одредени податоци (како моментална локација) привремено недостасуваат во системот.
     267
     268{{{#!sql
     269
     270CREATE OR REPLACE VIEW vw_driver_profile AS
     271SELECT
     272    d.driver_id,
     273    d.name                                  AS driver_name,
     274    d.phone                                 AS driver_phone,
     275    d.rating                                AS driver_rating,
     276    d.registration_date,
     277
     278    -- Dali e momentalno aktiven/dostapen
     279    ad.is_available,
     280    ad.working_start,
     281    ad.working_end,
     282
     283    -- Momentalna lokacija
     284    l.grad                                  AS current_grad,
     285    l.naselba                               AS current_naselba,
     286    l.ulica                                 AS current_ulica,
     287    l.latitude                              AS current_lat,
     288    l.longitude                             AS current_lng,
     289
     290    -- Vozilo
     291    vo.Vehicle_ownership_id,
     292    vo.Plate                                AS vehicle_plate,
     293    vo.Color                                AS vehicle_color,
     294    vo.year                                 AS vehicle_year,
     295
     296    -- Tip i brend
     297    vm.Model                                AS vehicle_brand,
     298    vt.type_name                            AS vehicle_model,
     299    vt.description                          AS vehicle_class,   -- Economy / Luxury
     300
     301    -- Cena za ovoj vozac
     302    pr.base_price,
     303    pr.price_per_km,
     304
     305    -- Status na vozacot
     306    s.status_text                           AS driver_status
     307
     308FROM Drivers d
     309         JOIN Status s                       ON d.status_id              = s.status_id
     310         LEFT JOIN Active_drivers ad         ON d.driver_id              = ad.driver_id
     311         LEFT JOIN Locations l               ON ad.current_location_id   = l.location_id
     312         LEFT JOIN Drivers_Vehicle_ownership dvo ON d.driver_id          = dvo.driver_id
     313         LEFT JOIN Vehicle_ownership vo      ON dvo.Vehicle_ownership_id = vo.Vehicle_ownership_id
     314         LEFT JOIN Vehicle_types vt          ON vo.vehicle_type_id       = vt.vehicle_type_id
     315         LEFT JOIN Vehicles_model vm         ON vt.Vehicles_model_id     = vm.Vehicles_model_id
     316         LEFT JOIN Pricing_rules pr          ON vt.vehicle_type_id       = pr.vehicle_type_id
     317WHERE s.status_text = 'active' and ad.is_available is true;
     318
     319
     320select * from vw_driver_profile;
     321}}}
     322
     323
     324== VIEW 5: vw_cancellation_details ==
     325Овој поглед е наменет за анализа на откажаните возења и следење на оперативната ефикасност на системот. Тој овозможува лесна идентификација на причините за откажувањата, што е критично за подобрување на квалитетот на услугите и корисничкото искуство.
     326
     327Што прави овој поглед?
     328
     329Идентификација на одговорноста: Јасно го дефинира изворот на откажувањето преку cancelled_by_type (корисник, возач или администратор) и ја наведува причината (reason), што овозможува сегментирана анализа на проблемите.
     330
     331Финансиски увид: Ја прикажува „пенал-таксата“ (cancellation_fee) која се наплаќа, овозможувајќи следење на приходите остварени од откажани возења.
     332
     333Контекстуална анализа: Ги поврзува податоците за откажувањето со деталите за самото возење (корисник, возач, локација на поаѓање, дистанца), што помага да се утврди дали постојат специфични шеми (на пр. одредена локација или тип на возило каде откажувањата се почести).
     334
     335Временска рамка: Ги споредува времето на креирање на барањето (request_time) и времето на откажување (cancelled_at), што е клучен параметар за мерење на времето на одзив на возачите.
     336
     337{{{#!sql
     338
     339CREATE OR REPLACE VIEW vw_cancellation_details AS
     340SELECT
     341    c.cancellation_id,
     342    c.ride_id,
     343
     344    -- Koj otkazal
     345    c.cancelled_by_type,                    -- USER / DRIVER / ADMIN
     346    c.cancelled_by_id,
     347    c.reason,
     348    c.cancellation_fee,
     349    c.created_at                            AS cancelled_at,
     350
     351    -- Korisnik na voznata
     352    u.user_id,
     353    u.name                                  AS user_name,
     354    u.phone                                 AS user_phone,
     355
     356    -- Vozac na voznata
     357    d.driver_id,
     358    d.name                                  AS driver_name,
     359    d.phone                                 AS driver_phone,
     360
     361    -- Vozilo (za da se vidi dali e Economy ili Luxury)
     362    vt.description                          AS vehicle_class,
     363    pr.base_price                           AS tariff_base_price,
     364
     365    -- Pickup lokacija
     366    lp.naselba                              AS pickup_naselba,
     367    lp.ulica || ' ' || lp.broj             AS pickup_address,
     368
     369    -- Vreme na baranjeto
     370    r.request_time,
     371    r.distance_km,
     372
     373    -- Status na voznata
     374    s.status_text                           AS ride_status
     375
     376FROM Cancellations c
     377         JOIN Rides r            ON c.ride_id                    = r.ride_id
     378         JOIN Users u            ON r.user_id                    = u.user_id
     379         JOIN Drivers d          ON r.driver_id                  = d.driver_id
     380         JOIN Status s           ON r.status_id                  = s.status_id
     381         JOIN Locations lp       ON r.pickup_location_id         = lp.location_id
     382         LEFT JOIN Vehicle_ownership vo      ON r.Vehicle_ownership_id = vo.Vehicle_ownership_id
     383         LEFT JOIN Vehicle_types vt          ON vo.vehicle_type_id       = vt.vehicle_type_id
     384         LEFT JOIN Pricing_rules pr          ON vt.vehicle_type_id       = pr.vehicle_type_id;
     385
     386
     387select * from vw_cancellation_details;
     388
     389select * from vw_cancellation_details where user_id = 19020;
     390
     391CREATE INDEX idx_cancellations_ride_id
     392    ON cancellations(ride_id DESC NULLS LAST);
     393
     394DROP INDEX idx_cancellations_ride_id;
     395
     396}}}
     397
     398
     399==  VIEW 6: vw_user_notifications ==
     400
     401Еве го описот за шестиот поглед (vw_user_notifications), подготвен за вашата техничка документација:
     402
     403Опис на погледот (View): vw_user_notifications
     404Овој поглед е дизајниран за централизирано следење на комуникацијата со корисниците. Тој ги обединува сите системски известувања испратени до корисниците, овозможувајќи лесен увид во историјата на известувањата и контекстот во кој биле испратени.
     405
     406Што прави овој поглед?
     407
     408Контекстуална историја: Ги поврзува пораките (Messages) со конкретни возења (Rides), што му овозможува на администраторот или на самиот корисник точно да знае на што се однесува секоја нотификација (на пр. „Возачот пристигна“ за возењето од вчера).
     409
     410Следење на испораката: Ги прикажува статусите на нотификациите (notification_status), што е важно за дијагностицирање на проблеми доколку корисникот тврди дека не добил известување за одреден настан.
     411
     412Адресна контекстуализација: Ги повлекува информациите за почетната и крајната локација на возењето (pickup_address, dropoff_address), со што се добива јасна слика за рутата без потреба од дополнителни пребарувања во други табели.
     413
     414Оперативна транспарентност: Ги вклучува времето на испраќање (sent_time) и статусот на возењето во тој момент, што помага во анализата на однесувањето на системот за нотификации во реално време.
     415
     416Оптимизација на перформансите
     417За да се обезбеди брзо пребарување на известувањата кои се однесуваат на одредени корисници или возења, дефинирани се индекси:
     418
     419idx_notifications_user_id: Оптимизира пристап до историјата на нотификации за конкретен корисник (важно за личниот профил на корисникот во апликацијата).
     420
     421idx_notifications_ride_id: Оптимизира пребарување на сите известувања поврзани со едно единствено возење (важно за корисничка поддршка при истражување на конкретен случај).
     422{{{#!sql
     423CREATE OR REPLACE VIEW vw_user_notifications AS
     424SELECT
     425    n.notification_id,
     426
     427    -- Korisnik
     428    u.user_id,
     429    u.name                                  AS user_name,
     430
     431    -- Poraka
     432    m.message_id,
     433    m.message_text,
     434    n.sent_time,
     435
     436    -- Za koja voznja se odnesuva
     437    n.ride_id,
     438    r.request_time                          AS ride_request_time,
     439
     440    -- Kratka adresa za kontekst
     441    lp.naselba                              AS pickup_naselba,
     442    lp.ulica  ' '
     443 lp.broj             AS pickup_address,
     444    ld.ulica  ' '
     445 ld.broj             AS dropoff_address,
     446
     447    -- Status na voznata (za kontekst vo notifikacijata)
     448    sr.status_text                          AS ride_status,
     449
     450    -- Status na notifikacijata (sent / fail)
     451    sn.status_text                          AS notification_status
     452
     453FROM Notifications n
     454
     455         JOIN Users u            ON n.user_id                    = u.user_id
     456         JOIN Messages m         ON n.message_id                 = m.message_id
     457         JOIN Rides r            ON n.ride_id                    = r.ride_id
     458         JOIN Status sn          ON n.status_id                  = sn.status_id
     459         JOIN Status sr          ON r.status_id                  = sr.status_id
     460         JOIN Locations lp       ON r.pickup_location_id         = lp.location_id
     461         JOIN Locations ld       ON r.dropoff_location_id        = ld.location_id;
     462
     463
     464select * from vw_user_notifications;
     465
     466
     467select * from vw_user_notifications where user_id = 16095;
     468CREATE INDEX idx_notifications_user_id ON notifications(user_id DESC NULLS LAST);
     469
     470select * from vw_user_notifications where ride_id = 3005327;
     471CREATE INDEX idx_notifications_ride_id ON notifications(ride_id DESC NULLS LAST);
     472
     473DROP INDEX idx_notifications_user_id;
     474DROP INDEX idx_notifications_ride_id;
     475}}}