= Релационен Модел '''Релационен дијаграм''' [[Image(RelationalModel.jpg)]] Дијаграмот е изработен во Visual Paradigm (десктоп верзија) и прикажува целосен релационен модел на базата на податоци на !DriveNet со 29 табели. '''Описна документација и аргументација''' '''users, drivers, passengers — одвоени ентитети со заедничка база''' Корисниците се моделирани преку централна табела `users` која ги содржи заедничките атрибути (име, е-пошта, телефон, аватар итн.). Возачите и патниците се одвоени табели (`drivers`, `passengers`) со специфични атрибути за секоја улога — на пример, `max_detour_percent` е атрибут само на возачот, бидејќи единствено возачот одлучува колкаво отстапување на рутата е прифатливо. Еден корисник може да биде и возач и патник истовремено. '''vehicles, manufacturers, vehicle_models — хиерархија на возила''' Возилата се поврзани со производителите (`manufacturers`) и моделите (`vehicle_models`) преку посебни табели. Ова овозможува нормализирано чување на информациите за возилата и спречува дупликати на имиња на производители и модели. '''vehicle_ownership — врска возач-возило''' Поврзувачката табела `vehicle_ownership` ја моделира врската помеѓу возачите и нивните возила, при што еден возач може да поседува повеќе возила. '''routes, route_stops — рути со меѓустаници''' Рутата (`routes`) ги дефинира почетната и крајната точка, датумот и часот, бројот на слободни места и цената по километар. Меѓустаниците се чуваат одделно во табелата `route_stops` со редоследен број, што овозможува флексибилно дефинирање на рути со произволен број на застанувања. '''bookings — резервации по сегмент''' Резервацијата (`bookings`) е поврзана со конкретен патник, рута и почетна/крајна меѓустаница. Ова овозможува патникот да резервира само дел од рутата. Табелата содржи временски марки за потврда на качување (`pickup_confirmed_at`) и слегување (`dropoff_confirmed_at`). '''fare_splits — алгоритам за поделба на трошоци''' Бидејќи апликацијата работи исклучиво со готовинско плаќање, не постои табела за трансакции. Наместо тоа, `fare_splits` ги чува пресметаните износи кои секој патник треба да ги плати на возачот, врз основа на поминатата дистанца. '''ratings — оценување меѓу корисници''' Табелата `ratings` овозможува оценување меѓу учесниците по завршено патување. Дефиниран е CHECK constraint кој обезбедува дека корисникот не може да се оцени самиот себеси (`reviewer_user_id != reviewee_user_id`). '''notifications — известувања''' Табелата `notifications` чува известувања за корисниците (нови резервации, потврди, откажувања итн.) со статус на прочитаност.