Changes between Version 1 and Version 2 of RelationalModel
- Timestamp:
- 04/18/26 22:41:55 (2 weeks ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
RelationalModel
v1 v2 1 = Релационен Модел1 = Релационен модел 2 2 3 '''Релационен дијаграм''' 3 == ЕР Дијаграм 4 4 5 [[Image(RelationalModel.jpg )]]5 [[Image(RelationalModel.jpg, 1400px)]] 6 6 7 Дијаграмот е изработен во Visual Paradigm (десктоп верзија) и прикажува целосен релационен модел на базата на податоци на !DriveNet со 29 табели. 7 == Дополнителен Опис 8 8 9 - Табелите `users`, `drivers` и `passengers` се моделирани со заедничка база. Централната табела `users` ги чува општите податоци за сите корисници, додека `drivers` и `passengers` се проширувања со специфични атрибути за секоја улога. Еден корисник може да биде и возач и патник истовремено. 9 10 10 '''Описна документација и аргументација''' 11 - Табелата `vehicles` е поврзана со `vehicle_models` и `manufacturers` со цел нормализација на податоците за возилата и спречување на дупликати. Врската помеѓу возачите и возилата е моделирана преку `vehicle_ownership`, каде историјата на сопственост се зачувува — при промена на сопственик се додава нов запис наместо да се брише стариот. 11 12 12 '''users, drivers, passengers — одвоени ентитети со заедничка база''' 13 - Табелата `routes` претставува шаблон за рута (дефинирана патека помеѓу две локации), додека `rides` претставува конкретно возење на таа рута со определен возач, возило, датум и час. Меѓустаниците се чуваат во `route_stops` со редоследен број, што овозможува дефинирање на рути со произволен број на застанувања. Истата локација може да се повтори на рутата (пр. round trip). 13 14 14 Корисниците се моделирани преку централна табела `users` која ги содржи заедничките атрибути (име, е-пошта, телефон, аватар итн.). Возачите и патниците се одвоени табели (`drivers`, `passengers`) со специфични атрибути за секоја улога — на пример, `max_detour_percent` е атрибут само на возачот, бидејќи единствено возачот одлучува колкаво отстапување на рутата е прифатливо. Еден корисник може да биде и возач и патник истовремено.15 - Табелите `route_segments` и `passenger_segments` служат за прецизна пресметка на трошоците. `route_segments` ги дели возењата на сегменти помеѓу два последователни стопа, додека `passenger_segments` чува колку патници биле присутни на секој сегмент и колку треба да плати секој патник за него. Финалниот износ за секоја резервација се чува во `booking_final_fare`. 15 16 16 '''vehicles, manufacturers, vehicle_models — хиерархија на возила''' 17 - Во повеќе табели имаме подмножества на foreign keys коишто се nullable, но нивното значење зависи од контекстот. На пример: 18 - `bookings(pickup_stop_id, dropoff_stop_id)` — дефинираат сегментот кој го резервира патникот; ако патникот патува на целата рута, стоповите се почетниот и крајниот стоп 19 - `rides(recurrence_days, recurrence_end_date)` — се пополнуваат само доколку `is_recurring = TRUE`; за еднократни возења овие полиња се NULL 17 20 18 Возилата се поврзани со производителите (`manufacturers`) и моделите (`vehicle_models`) преку посебни табели. Ова овозможува нормализирано чување на информациите за возилата и спречува дупликати на имиња на производители и модели.21 - Табелите `toll_points`, `ride_tolls` и `toll_passenger_split` го моделираат системот за патарини. `toll_points` ги чува наплатните рампи со цени по тип на возило, `ride_tolls` евидентира кои рампи се поминати во конкретно возење, а `toll_passenger_split` ја дели патарината рамномерно меѓу патниците кои биле присутни на тој сегмент. 19 22 20 '''vehicle_ownership — врска возач-возило''' 23 - Бидејќи апликацијата работи исклучиво со готовинско плаќање, не постои табела за онлајн трансакции. Наместо тоа, `fare_splits` и `booking_final_fare` служат само како референтни алатки за возачот да знае колку да наплати од секој патник. 21 24 22 Поврзувачката табела `vehicle_ownership` ја моделира врската помеѓу возачите и нивните возила, при што еден возач може да поседува повеќе возила.25 - Оценувањето е моделирано преку табелата `ratings` со CHECK constraint кој осигурува дека корисникот не може да се оцени самиот себеси (`reviewer_user_id != reviewee_user_id`). Оцената на возачот/патникот не се чува директно како атрибут туку се пресметува динамички преку views (`driver_ratings`, `passenger_ratings`) за да се избегне inconsistency. 23 26 24 '''routes, route_stops — рути со меѓустаници''' 27 - Табелата `ride_status_history` и `booking_status_history` ги чуваат сите промени на статусот со временска марка, со цел да се овозможи целосна следливост на животниот циклус на возењето и резервацијата. 25 28 26 Рутата (`routes`) ги дефинира почетната и крајната точка, датумот и часот, бројот на слободни места и цената по километар. Меѓустаниците се чуваат одделно во табелата `route_stops` со редоследен број, што овозможува флексибилно дефинирање на рути со произволен број на застанувања. 27 28 '''bookings — резервации по сегмент''' 29 30 Резервацијата (`bookings`) е поврзана со конкретен патник, рута и почетна/крајна меѓустаница. Ова овозможува патникот да резервира само дел од рутата. Табелата содржи временски марки за потврда на качување (`pickup_confirmed_at`) и слегување (`dropoff_confirmed_at`). 31 32 '''fare_splits — алгоритам за поделба на трошоци''' 33 34 Бидејќи апликацијата работи исклучиво со готовинско плаќање, не постои табела за трансакции. Наместо тоа, `fare_splits` ги чува пресметаните износи кои секој патник треба да ги плати на возачот, врз основа на поминатата дистанца. 35 36 '''ratings — оценување меѓу корисници''' 37 38 Табелата `ratings` овозможува оценување меѓу учесниците по завршено патување. Дефиниран е CHECK constraint кој обезбедува дека корисникот не може да се оцени самиот себеси (`reviewer_user_id != reviewee_user_id`). 39 40 '''notifications — известувања''' 41 42 Табелата `notifications` чува известувања за корисниците (нови резервации, потврди, откажувања итн.) со статус на прочитаност. 29 - За зачувување на статистиките и евиденцијата дури и по бришење на корисници, сите foreign keys кон `users` користат `ON DELETE SET DEFAULT` со резервиран корисник `id=0` ("избришан корисник"). Foreign keys кон структурни табели (`rides`, `routes`, `bookings`) користат `ON DELETE RESTRICT` за да спречат случајно губење на поврзани податоци.
