| Version 8 (modified by , 7 days ago) ( diff ) |
|---|
Релационен модел
ЕР Дијаграм
Дополнителен Опис
- Табелите
users,driversиpassengersсе моделирани со заедничка база. Централната табелаusersги чува општите податоци за сите корисници, додекаdriversиpassengersсе проширувања со специфични атрибути за секоја улога. Еден корисник може да биде и возач и патник истовремено.
- Табелата
vehiclesе поврзана соvehicle_modelsиmanufacturersсо цел нормализација на податоците за возилата и спречување на дупликати. Врската помеѓу возачите и возилата е моделирана прекуvehicle_ownership, каде историјата на сопственост се зачувува — при промена на сопственик се додава нов запис наместо да се брише стариот.
- Табелата
routesпретставува шаблон за рута (дефинирана патека помеѓу две локации), додекаridesпретставува конкретно возење на таа рута со определен возач, возило, датум и час. Меѓустаниците се чуваат воroute_stopsсо редоследен број, што овозможува дефинирање на рути со произволен број на застанувања. Истата локација може да се повтори на рутата (пр. round trip).
- Табелите
route_segmentsиpassenger_segmentsслужат за прецизна пресметка на трошоците.route_segmentsги дели возењата на сегменти помеѓу два последователни стопа, додекаpassenger_segmentsчува колку патници биле присутни на секој сегмент и колку треба да плати секој патник за него. Финалниот износ за секоја резервација се чува воbooking_final_fare.
- Во повеќе табели имаме подмножества на foreign keys коишто се nullable, но нивното значење зависи од контекстот. На пример:
bookings(pickup_stop_id, dropoff_stop_id)— дефинираат сегментот кој го резервира патникот; ако патникот патува на целата рута, стоповите се почетниот и крајниот стопrides(recurrence_days, recurrence_end_date)— се пополнуваат само доколкуis_recurring = TRUE; за еднократни возења овие полиња се NULL
- Табелите
toll_points,ride_tollsиtoll_passenger_splitго моделираат системот за патарини.toll_pointsги чува наплатните рампи со цени по тип на возило,ride_tollsевидентира кои рампи се поминати во конкретно возење, аtoll_passenger_splitја дели патарината рамномерно меѓу патниците кои биле присутни на тој сегмент.
- Бидејќи апликацијата работи исклучиво со готовинско плаќање, не постои табела за онлајн трансакции. Наместо тоа,
fare_splitsиbooking_final_fareслужат само како референтни алатки за возачот да знае колку да наплати од секој патник.
- Оценувањето е моделирано преку табелата
ratingsсо CHECK constraint кој осигурува дека корисникот не може да се оцени самиот себеси (reviewer_user_id != reviewee_user_id). Оцената на возачот/патникот не се чува директно како атрибут туку се пресметува динамички преку views (driver_ratings,passenger_ratings) за да се избегне inconsistency.
- Табелата
ride_status_historyиbooking_status_historyги чуваат сите промени на статусот со временска марка, со цел да се овозможи целосна следливост на животниот циклус на возењето и резервацијата.
- За зачувување на статистиките и евиденцијата дури и по бришење на корисници, сите foreign keys кон
usersкористатON DELETE SET DEFAULTсо резервиран корисникid=0("избришан корисник"). Foreign keys кон структурни табели (rides,routes,bookings) користатON DELETE RESTRICTза да спречат случајно губење на поврзани податоци.
## Прегледи (Views)
Базата на податоци содржи девет прегледи кои ги покриваат најчестите случаи на употреба на апликацијата. Секој преглед е дизајниран да го замени повторувачкиот JOIN код во апликацискиот слој и да обезбеди конзистентен приказ на податоците.
### v_available_rides
Го прикажува списокот на сите возења со статус scheduled кои се достапни за резервација. За секое возење ги обединува податоците за возачот, возилото, марката и моделот, рутата, почетниот и крајниот град, и пресметува проценет вкупен трошок врз основа на должината на рутата и цената по километар. Просечната оцена на возачот е агрегирана директно во прегледот преку LEFT JOIN со ratings. Овој преглед го користи екранот за пребарување на возења — кога патникот внесува дестинација, апликацијата едноставно додава WHERE origin_city = ... или WHERE departure_time >= ... на овој преглед.
### v_driver_profile
Обединет приказ на профилот на возачот — лични податоци, информации за возачката дозвола, примарното активно возило (ако има повеќе, се зема она со најмал vehicle_id), бројот на вкупни, завршени и откажани возења, како и агрегираната оцена. Дизајниран е за страницата на профилот на возачот, но истиот преглед го користи и патникот кога сака да провери со кого патува пред да резервира место.
### v_passenger_trip_history
Целосна историја на патувања за секој патник — резервации со статус, имиња на возачот, почетен и краен град, потврди за качување и слегување, финалната сума и оценката што патникот ја дал. Редовите не се групирани — секоја резервација е посебен ред, па апликацијата може лесно да ги пагинира или филтрира по статус. Ги заменува сложените вгнездени упити кои инаку би биле потребни за приказот „Моите патувања“.
### v_ride_manifest
Листа на сите потврдени, активни и завршени патници за секое возење, со нивните имиња, телефонски броеви, места на качување и слегување и финалната сума. Возачот го користи овој преглед пред поаѓање за да знае кого чека, каде да застане и колку да наплати. Прикажува само резервации со статус confirmed, picked_up или completed — откажаните резервации намерно се исклучени за да не го збунат возачот.
### v_driver_earnings
Месечен преглед на приходите по возач, пресметан врз основа на завршените резервации и нивните финални суми. За секој месец ги прикажува бројот на возења, бројот на наплатени резервации, вкупниот приход, просечниот, максималниот и минималниот износ по резервација. Корисен е и за возачот (личен финансиски преглед) и за администраторот (следење на активноста на платформата по период).
### v_route_popularity
Ги рангира сите рути според вкупниот број на резервации. Покрај бројките, прикажува и просечна цена по резервација и просечна цена по километар за секоја рута. Целта е двојна: прво, на почетниот екран да се прикажат најбараните рути како предлози; второ, да служи за аналитика — ако одредена рута има многу возења, но мал број на резервации, тоа е сигнал дека цената е превисока или дека постои проблем со достапноста.
### v_booking_details
Комплетен детален запис за една резервација — сè на едно место: патник, возач, возило со регистарски таблички, места на качување и слегување со имиња на локациите и градовите, времето на поаѓање, статусот и финалниот износ. Наменет е за екранот со потврда на резервација и за генерирање на потврда/сметка. Поради тоа што содржи многу JOIN-ови, апликацијата секогаш го повикува со WHERE booking_id = ? — никогаш без филтер.
### v_unread_notifications
Ги враќа само непрочитаните нотификации (каде read_at IS NULL), збогатени со името на корисникот и пресметаната „старост во минути“ (age_mins), за да може апликацијата да прикаже „пред 5 минути“ без дополнителна логика. Прегледот е наменет за ѕвончето за нотификации во мобилната апликација и секогаш се повикува со WHERE user_id = ? за конкретниот најавен корисник.
### v_incident_summary
Административен преглед на сите пријавени инциденти со целосен контекст — тип и опис на инцидентот, времето на пријавување, личните податоци на пријавувачот и возачот (вклучувајќи го бројот на возачката дозвола) и рутата на возењето. Дизајниран е исклучиво за администраторскиот панел за безбедност и не е изложен кон патничкиот или возачкиот интерфејс. Прикажува инциденти за сите возења без разлика на нивниот статус, бидејќи инцидент може да биде пријавен и по завршено возење.
Attachments (3)
- RelationalModel.jpg (249.3 KB ) - added by 2 weeks ago.
- RelationalModel.zip (60.3 KB ) - added by 13 days ago.
- RelationalModel-drive-net.svg (481.4 KB ) - added by 11 days ago.
Download all attachments as: .zip
