= Релационен модел == ЕР Дијаграм [[Image(RelationalModel.zip, 1400px)]] == Дополнителен Опис - Табелите `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` за да спречат случајно губење на поврзани податоци.