| Version 9 (modified by , 7 days ago) ( diff ) |
|---|
# Релационен модел
## ЕР дијаграм

## Архитектура и главни концепти
### Користачи и нивни улоги
Табелите users, drivers и passengers функционираат по принцип на инхеритација. Базната табела users содржи основни информации за сите во системот, додека drivers и passengers се специјализирани и содржат само релевантни атрибути за та улога. Јавно еден кориснички профил може да има и две улоги истовремено — да е и возач и патник.
### Возила и нивна класификација
Возилата се организирани во три нивоа: manufacturers (производител), vehicle_models (модел) и vehicles (конкретно возило). Овој пристап спречува дупликување на податоци. Врската помеѓу возачите и возилата е моделирана преку табелата vehicle_ownership, која чува целосна историја на сопственост. Кога некој во возачот промени возило, новиот запис се додава, а старите се задржуваат — никогаш не бришеме историја.
### Рути и возења
Табелата routes е шаблон — претставува дефинирана патека со нејзиниот редослед на застанувања. Табелата rides пак претставува конкретно возење кое возачот го организира врз база на таа рута — сакај определен датум, час и возило.
Застанувањата на рутата се чувуваат во route_stops со редоследен број, што значи рутата може да има колку сакаш застанувања. Истата локација може да се појави повеќе пати (на пример, круговна рута).
### Сегментирање на возења и наплата
За прецизна пресметка на цена, возењата се делат на сегменти:
route_segments— ја дели рутата на делови помеѓу два последователни застанувањаpassenger_segments— чува колку патници биле на секој сегмент и колку треба да плати секој од нив
Финалната сума за секоја резервација се чува во booking_final_fare.
### Условни полиња (nullable foreign keys)
Неколку табели имаат nullable foreign keys, а нивното значење зависи од контекст:
bookings.pickup_stop_idиbookings.dropoff_stop_id— го дефинираат сегментот што го резервира патникот. Ако патникот патува на целата рута, тие се почетниот и крајниот стоп.rides.recurrence_daysиrides.recurrence_end_date— се пополнуваат само когаis_recurring = TRUE. За еднократни возења, овие полиња се NULL.
### Система за патарини
Три табели работат заедно за управување со патаринските рампи:
toll_points— наплатни рампи со цена по тип возилоride_tolls— евидентира кои рампи се поминати во одредено возењеtoll_passenger_split— ја дели цената рамномерно меѓу патниците кои биле присутни на тој делот
### Готовинско плаќање
Апликацијата работи исклучиво со готовина, така што нема табела за онлајн трансакции. Табелите fare_splits и booking_final_fare служат како референцијални алатки — возачот ги користи за да знае колку да собере од секој патник, исё.
### Оценување (Рејтинги)
Оценувањето функционира преку табелата ratings со CHECK constraint кој спречува самооценување. Оценката на возач/патник не се чува како просто поле, туку се пресметува динамички преку driver_ratings и passenger_ratings views за да останува во синхрона.
### Историја и следливост
Две табели чуваат целосна историја на промени:
ride_status_history— сите промени на статусот на возењеbooking_status_history— сите промени на статусот на резервација
Секоја промена има временска марка, што овозможува целосна следливост.
### Бришење на податоци
За да се задржи статистика и обврски дури и кога кориснички профили се избришат, сите foreign keys кон users користат ON DELETE SET NULL или се поврзуваат со резервиран корисник со id = 0 ("избришан кориснік"). Foreign keys кон критични табели (rides, routes, bookings) користат ON DELETE RESTRICT — не смее ништо да се избрише ако е поврзано.
---
## Прегледи (Views)
Базата содржи девет прегледи кои го поедностављуваат најчестиот код во апликацијата.
### v_available_rides
Ги прикажува сите возења со статус scheduled кои се отворени за резервирање. За секое возење ја обединува информацијата за возачот, возилото, марката, моделот, рутата и градовите, плус пресметана проценета цена врз база на должина на рута и цена по км. Просечната оцена на возачот е веќе вклучена.
Апликацијата го користи при пребарување — просто добива WHERE за град на почеток, час, итн.
### v_driver_profile
Комплетна слика на возачкиот профил — лични податоци, возачка дозвола, примарното возило, укупно/завршено/откажано возења и просечна оцена. Koristi ga возачот при ажурирање на своја страна и патникот при проверка со кого се сокува пред резервирање.
### v_passenger_trip_history
Целосна историја на патувања за секој патник — резервации со статус, име на возач, почеток/крај, потврди за качување/слегување, финална цена и оценка. Секоја резервација е редок (не групиран), што го едностави филтерирањето и пагинирањето во апликацијата.
### v_ride_manifest
Список на сите потврдени, активни и завршени патници за одредено возење — имиња, телефони, места на качување/слегување, финална цена. Возачот го гледа пред поаѓање за да знае кого чека, каде да застане и колку да наплати.
### v_driver_earnings
Месечен преглед на приходите по возач. За секој месец прикажува број возења, број наплатени резервации, вкупен приход, просек и min/max по резервација. Корисно е и за возачот (лична финансиска контрола) и за администраторот (анализа на активност).
### v_route_popularity
Ги рангира рутите по број на резервации. Прикажува просечна цена по резервација и просечна цена по км. Служи за препораки на почетниот екран и за анализа — ако рута има многу возења но малку резервации, сигнал е дека нешто не е окај (премногу скапо, лоша достапност).
### v_booking_details
Целосна слика на една резервација — патник, возач, возило со регистарски табички, места (со имиња на локации и градови), време поаѓање, статус, финална цена. Користи се при потврда и при генерирање на сметка. Апликацијата секогаш го вика со WHERE booking_id = ? — никогаш без филтер.
### v_unread_notifications
Само непрочитаните нотификации (каде read_at IS NULL), збогатени со име на корисник и „старост во минути" за лесна приказ (нпр. „пред 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
