Changes between Version 5 and Version 6 of RelationalModel


Ignore:
Timestamp:
04/19/26 23:49:47 (13 days ago)
Author:
231055
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • RelationalModel

    v5 v6  
    33=== Relational diagram ===
    44
    5 Ова е деталниот релационен модел за системот GEOCAB (Taxi Services Application). Моделот е изработен во Visual Paradigm и содржи 18 табели кои ја опфаќаат комплетната логика на бизнис процесот.
     5Ова е деталниот релационен модел за системот GEOCAB (Taxi Services Application). Моделот е изработен во Visual Paradigm (desktop верзија) и содржи 18 табели кои ја опфаќаат комплетната логика на бизнис процесот.
    66
    7 [[Image(RelationalModel.jpg, width=800)]]
     7Дијаграмот е експортиран како SVG фајл (RelationalModel-ProjectCode.svg) и е прикачен на оваа страница. Исто така, прикачен е и оригиналниот Visual Paradigm модел (RelationalModel-ProjectCode.vpp).
     8
     9[[Image(RelationalModel-ProjectCode.svg, width=800)]]
    810
    911----
     
    1113=== Descriptive documentation and argumentation ===
    1214
    13 Врз основа на приложениот DDL и релационата шема, еве ги клучните сегменти на моделот:
     15Клучни сегменти од моделот кои не се целосно очигледни, заедно со аргументи за донесените дизајнерски одлуки:
    1416
    15  * '''Управување со возила и тарифи (`Vehicle_ownership`, `Pricing_rules`):'''
    16 Моделот овозможува флексибилност преку разделување на физичките возила од нивните модели и типови. Табелата `Pricing_rules` е директно поврзана со `Vehicle_types`, што овозможува системот автоматски да пресметува `base_price` и `price_per_km` во зависност од тоа дали корисникот избрал стандардно или луксузно возило.
     17 * '''Сегмент: Rides и Locations'''
     18Табелата `Rides` користи два Foreing Keys (`pickup_location_id` и `dropoff_location_id`) кои реферираат кон `Locations`. Овој пристап овозможува повторна употреба на истите локации во повеќе возења и избегнува дуплирање на адресни податоци. Дополнително, `Locations` содржи и географски координати што овозможува идни проширувања како GPS следење и оптимизација на рути. Чувањето на адресните податоци директно во `Rides` би довело до редундантност и потешко одржување.
    1719
    18  * '''Следење на активност во реално време (`Active_drivers`):'''
    19 За да се оптимизираат перформансите, динамичните податоци (моментална локација, достапност и работно време) се издвоени во `Active_drivers`. Ова овозможува брзо пребарување на слободни возачи без да се оптоварува главната табела `Drivers` со чести промени.
     20 * '''Сегмент: Status (централизација на статуси)'''
     21Табелата `Status` е поврзана со повеќе ентитети (`Users`, `Drivers`, `Admins`, `Rides`, `Payments`, `Notifications`). Наместо статусите да се чуваат како текст во секоја табела, тие се централизирани. Ова обезбедува конзистентност и олеснува идни промени или додавање нови статуси. Алтернативен пристап со текстуални вредности во секоја табела би довел до неконзистентни податоци и дуплирање.
    2022
    21  * '''Логика на возења и трансакции (`Rides`, `Payments`):'''
    22 Табелата `Rides` е централна точка каде се поврзуваат корисникот, возачот и две локации (pickup и dropoff). Специфично е моделирана табелата `Cancellations` која следи кој го откажал возењето (USER, DRIVER или ADMIN) и дали се наплаќа пенали (`cancellation_fee`).
     23 * '''Сегмент: Vehicles и ownership модел'''
     24Возилата се моделирани преку повеќе поврзани табели (`Vehicles_model`, `Vehicle_types`, `Vehicle_ownership`) со цел да се постигне нормализација и флексибилност. Табелата `Drivers_Vehicle_ownership` имплементира many-to-many релација, овозможувајќи еден возач да користи повеќе возила и обратно. Доколку оваа врска беше имплементирана директно во `Drivers` или `Vehicle_ownership`, би се изгубила флексибилноста и би се ограничиле можните сценарија.
    2325
    24  * '''Интегритет и ограничувања:'''
    25 Во сите табели се применети строги ограничувања (`CONSTRAINT`), како што се проверки за валидност на е-маил, телефонски број и рејтинг (0-5). Релациите користат `ON DELETE RESTRICT` за клучните матични податоци (Status, Locations) за да се спречи случајно бришење на историски записи.
     26 * '''Сегмент: Pricing_rules'''
     27Цените се дефинирани во табелата `Pricing_rules` и се поврзани со `Vehicle_types`, наместо да се чуваат директно во `Rides`. Ова овозможува централизирано управување со цените и нивно лесно ажурирање. Доколку цените беа зачувани во `Rides`, секоја промена на ценовна политика би барала сложени ажурирања и би постоел ризик од неконзистентност.
     28
     29 * '''Сегмент: Active_drivers (динамички податоци)'''
     30Табелата `Active_drivers` ги содржи само динамичките податоци како моментална локација, достапност и работно време. Оваа поделба е направена со цел да се подобрат перформансите и да се избегне често ажурирање на табелата `Drivers`. Чувањето на овие податоци во `Drivers` би довело до непотребно оптоварување и намалена ефикасност.
     31
     32 * '''Сегмент: Payments и Payment_methods'''
     33Табелата `Payments` е поврзана со `Rides` и `Payment_methods`, што овозможува поддршка за различни начини на плаќање. Оваа поделба овозможува флексибилност и проширување без промена на основната логика. Доколку типот на плаќање беше директно запишан во `Payments` како текст, би се намалила конзистентноста и би се отежнало додавањето нови методи.
     34
     35 * '''Сегмент: Notifications и Messages'''
     36Системот за нотификации е моделиран преку табелите `Notifications` и `Messages`. `Messages` ги содржи текстовите, додека `Notifications` ги поврзува со конкретни корисници и возења. Ова овозможува повторна употреба на истите пораки и избегнува дуплирање. Доколку текстот се чуваше директно во `Notifications`, би се намалила флексибилноста.
     37
     38 * '''Сегмент: Cancellations'''
     39Табелата `Cancellations` е издвоена од `Rides` за да се овозможи детално следење на откажувањата (кој откажал, причина, пенали). Овој пристап овозможува подобра анализа и извештаи. Вградувањето на овие податоци во `Rides` би ја усложнило табелата и би ја намалило јасноста на моделот.
    2640
    2741----
    28 === DDL Scripts (PostgreSQL) ===
    29 {{{
    30 CREATE TABLE Status (
    31                         status_id SERIAL PRIMARY KEY,
    32                         status_tip VARCHAR(255) NOT NULL,
    33                         status_text VARCHAR(255) NOT NULL
    34 
    35 );
    36 CREATE TABLE Vehicles_model (
    37                                 Vehicles_model_id SERIAL PRIMARY KEY,
    38                                 Model VARCHAR(255) NOT NULL
    39 );
    40 CREATE TABLE Locations (
    41                            location_id SERIAL PRIMARY KEY,
    42                            latitude NUMERIC(9,6) NOT NULL,
    43                            longitude NUMERIC(9,6) NOT NULL,
    44                            grad VARCHAR(255) NOT NULL,
    45                            naselba VARCHAR(255) NOT NULL,
    46                            ulica VARCHAR(255) NOT NULL,
    47                            broj VARCHAR(255) NOT NULL,
    48                            created_at TIMESTAMP NOT NULL
    49 );
    50 CREATE TABLE Users (
    51                        User_id SERIAL PRIMARY KEY,
    52                        name VARCHAR(255) NOT NULL,
    53                        username VARCHAR(255) NOT NULL UNIQUE,
    54                        phone VARCHAR(255) NOT NULL UNIQUE,
    55                        email VARCHAR(255) NOT NULL UNIQUE,
    56                        password_hash TEXT NOT NULL,
    57                        created_at TIMESTAMP NOT NULL,
    58                        status_id INT NOT NULL,
    59 
    60                        CONSTRAINT chk_users_phone CHECK (phone ~ '^[0-9+]+$'),
    61                        CONSTRAINT chk_users_email CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$'),
    62 
    63                        CONSTRAINT FK_Users_Status
    64                            FOREIGN KEY (status_id) REFERENCES Status(status_id)
    65                                ON DELETE RESTRICT
    66                                ON UPDATE CASCADE
    67 );
    68 CREATE TABLE Drivers (
    69                          driver_id SERIAL PRIMARY KEY,
    70                          name VARCHAR(255) NOT NULL,
    71                          phone VARCHAR(255) NOT NULL UNIQUE,
    72                          license_number VARCHAR(255) NOT NULL UNIQUE,
    73                          registration_date DATE NOT NULL,
    74                          rating NUMERIC(3,2) NOT NULL,
    75                          status_id INT NOT NULL,
    76 
    77                          CONSTRAINT chk_drivers_phone CHECK (phone ~ '^[0-9+]+$'),
    78                          CONSTRAINT chk_drivers_rating CHECK (rating BETWEEN 0 AND 5),
    79 
    80                          CONSTRAINT FK_Drivers_Status
    81                              FOREIGN KEY (status_id) REFERENCES Status(status_id)
    82                                  ON DELETE RESTRICT
    83                                  ON UPDATE CASCADE
    84 );
    85 CREATE TABLE Admins (
    86                         admins_id SERIAL PRIMARY KEY,
    87                         name VARCHAR(255) NOT NULL,
    88                         username VARCHAR(255) NOT NULL UNIQUE,
    89                         phone VARCHAR(255) NOT NULL UNIQUE,
    90                         email VARCHAR(255) NOT NULL UNIQUE,
    91                         password_hash TEXT NOT NULL,
    92                         created_at TIMESTAMP NOT NULL,
    93                         status_id INT NOT NULL,
    94 
    95                         CONSTRAINT chk_admins_phone CHECK (phone ~ '^[0-9+]+$'),
    96                         CONSTRAINT chk_admins_email CHECK (email ~ '^[^@]+@[^@]+\.[^@]+$'),
    97 
    98                         CONSTRAINT FK_Admins_Status
    99                             FOREIGN KEY (status_id) REFERENCES Status(status_id)
    100                                 ON DELETE RESTRICT
    101                                 ON UPDATE CASCADE
    102 );
    103 CREATE TABLE Vehicle_types (
    104                                vehicle_type_id SERIAL PRIMARY KEY,
    105                                type_name VARCHAR(255) NOT NULL,
    106                                description VARCHAR(255) NOT NULL,
    107                                Vehicles_model_id INT NOT NULL,
    108 
    109                                CONSTRAINT FK_Vehicle_types_Model
    110                                    FOREIGN KEY (Vehicles_model_id)
    111                                        REFERENCES Vehicles_model(Vehicles_model_id)
    112                                        ON DELETE RESTRICT
    113                                        ON UPDATE CASCADE
    114 );
    115 CREATE TABLE Vehicle_ownership (
    116                                    Vehicle_ownership_id SERIAL PRIMARY KEY,
    117                                    Plate VARCHAR(255) NOT NULL UNIQUE,
    118                                    Traffic_permit VARCHAR(255) NOT NULL UNIQUE,
    119                                    Color VARCHAR(255) NOT NULL,
    120                                    year INT NOT NULL,
    121                                    vehicle_type_id INT NOT NULL,
    122 
    123                                    CONSTRAINT chk_vehicle_year CHECK (year >= 1900),
    124 
    125                                    CONSTRAINT FK_Vehicle_ownership_Type
    126                                        FOREIGN KEY (vehicle_type_id)
    127                                            REFERENCES Vehicle_types(vehicle_type_id)
    128                                            ON DELETE RESTRICT
    129                                            ON UPDATE CASCADE
    130 );
    131 CREATE TABLE Pricing_rules (
    132                                tariff_id SERIAL PRIMARY KEY,
    133                                base_price NUMERIC(10,2) NOT NULL,
    134                                price_per_km NUMERIC(10,2) NOT NULL,
    135                                vehicle_type_id INT NOT NULL,
    136 
    137                                CONSTRAINT chk_price CHECK (base_price >= 0 AND price_per_km >= 0),
    138 
    139                                CONSTRAINT FK_Pricing_rules_Vehicle_types
    140                                    FOREIGN KEY (vehicle_type_id)
    141                                        REFERENCES Vehicle_types(vehicle_type_id)
    142                                        ON DELETE RESTRICT
    143                                        ON UPDATE CASCADE
    144 );
    145 CREATE TABLE Drivers_Vehicle_ownership (
    146                                            driver_id INT NOT NULL,
    147                                            Vehicle_ownership_id INT NOT NULL,
    148 
    149                                            PRIMARY KEY (driver_id, Vehicle_ownership_id),
    150 
    151                                            CONSTRAINT FK_DVO_Drivers
    152                                                FOREIGN KEY (driver_id)
    153                                                    REFERENCES Drivers(driver_id)
    154                                                     ON DELETE CASCADE,
    155 
    156                                            CONSTRAINT FK_DVO_Vehicles
    157                                                FOREIGN KEY (Vehicle_ownership_id)
    158                                                    REFERENCES Vehicle_ownership(Vehicle_ownership_id)
    159                                                    ON DELETE CASCADE
    160 );
    161 CREATE TABLE Active_drivers (
    162                                 driver_id INT PRIMARY KEY,
    163                                 current_location_id INT NOT NULL,
    164                                 is_available BOOLEAN NOT NULL,
    165                                 working_start TIMESTAMP NOT NULL,
    166                                 working_end TIMESTAMP NOT NULL,
    167 
    168                                 CONSTRAINT FK_Active_drivers_Drivers
    169                                     FOREIGN KEY (driver_id)
    170                                         REFERENCES Drivers(driver_id)
    171                                         ON DELETE CASCADE,
    172 
    173                                 CONSTRAINT FK_Active_drivers_Locations
    174                                     FOREIGN KEY (current_location_id)
    175                                         REFERENCES Locations(location_id)
    176                                         ON DELETE RESTRICT
    177 );
    178 CREATE TABLE Rides (
    179                        ride_id SERIAL PRIMARY KEY,
    180                        user_id INT NOT NULL,
    181                        driver_id INT NOT NULL,
    182                        pickup_location_id INT NOT NULL,
    183                        dropoff_location_id INT NOT NULL,
    184                        status_id INT NOT NULL,
    185                        request_time TIMESTAMP NOT NULL,
    186                        pickup_time TIMESTAMP NOT NULL,
    187                        start_time TIMESTAMP NOT NULL,
    188                        end_time TIMESTAMP NOT NULL,
    189                        distance_km NUMERIC(6,2) NOT NULL,
    190                        final_price NUMERIC(10,2) NOT NULL,
    191                        discount_percentage NUMERIC(5,2) NOT NULL,
    192 
    193                        CONSTRAINT chk_distance CHECK (distance_km >= 0),
    194                        CONSTRAINT chk_discount CHECK (discount_percentage BETWEEN 0 AND 100),
    195 
    196                        CONSTRAINT FK_Rides_Users
    197                            FOREIGN KEY (user_id) REFERENCES Users(User_id) ON DELETE RESTRICT,
    198 
    199                        CONSTRAINT FK_Rides_Drivers
    200                            FOREIGN KEY (driver_id) REFERENCES Drivers(driver_id) ON DELETE RESTRICT,
    201 
    202                        CONSTRAINT FK_Rides_Pickup_Location
    203                            FOREIGN KEY (pickup_location_id) REFERENCES Locations(location_id) ON DELETE RESTRICT,
    204 
    205                        CONSTRAINT FK_Rides_Dropoff_Location
    206                            FOREIGN KEY (dropoff_location_id) REFERENCES Locations(location_id) ON DELETE RESTRICT,
    207 
    208                        CONSTRAINT FK_Rides_Status
    209                            FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT
    210 );
    211 CREATE TABLE Payment_methods(
    212                                 payment_method_id SERIAL PRIMARY KEY,
    213                                 payment_tip  VARCHAR(255) NOT NULL
    214 );
    215 CREATE TABLE Payments (
    216                           payment_id SERIAL PRIMARY KEY,
    217                           amount NUMERIC(10,2) NOT NULL,
    218                           payment_method_id INT NOT NULL,
    219                           payment_time TIMESTAMP NOT NULL,
    220                           ride_id INT NOT NULL,
    221                           status_id INT NOT NULL,
    222 
    223                           CONSTRAINT chk_amount CHECK (amount >= 0),
    224 
    225                           CONSTRAINT FK_Payments_Rides
    226                               FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE,
    227 
    228                           CONSTRAINT FK_Payments_Status
    229                               FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT,
    230 
    231                           CONSTRAINT FK_Payments_Method
    232                               FOREIGN KEY (payment_method_id) REFERENCES Payment_methods(payment_method_id) ON DELETE RESTRICT
    233 );
    234 CREATE TABLE Ratings (
    235                          rating_id SERIAL PRIMARY KEY,
    236                          score INT NOT NULL,
    237                          comment VARCHAR(255),
    238                          created_at TIMESTAMP NOT NULL,
    239                          ride_id INT NOT NULL,
    240                          User_id INT NOT NULL,
    241                          driver_id INT NOT NULL,
    242 
    243                          CONSTRAINT chk_score CHECK (score BETWEEN 1 AND 5),
    244 
    245                          CONSTRAINT FK_Ratings_Rides
    246                              FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE,
    247 
    248                          CONSTRAINT FK_Ratings_Users
    249                              FOREIGN KEY (User_id) REFERENCES Users(User_id) ON DELETE CASCADE,
    250 
    251                          CONSTRAINT FK_Ratings_Drivers
    252                              FOREIGN KEY (driver_id) REFERENCES Drivers(driver_id) ON DELETE CASCADE
    253 );
    254 CREATE TABLE Cancellations (
    255                                cancellation_id SERIAL PRIMARY KEY,
    256                                cancelled_by_type VARCHAR(255) NOT NULL,
    257                                cancelled_by_id INT NOT NULL,
    258                                reason VARCHAR(255) NOT NULL,
    259                                cancellation_fee NUMERIC(10,2) NOT NULL,
    260                                created_at TIMESTAMP NOT NULL,
    261                                ride_id INT NOT NULL,
    262 
    263                                CONSTRAINT chk_fee CHECK (cancellation_fee >= 0),
    264                                CONSTRAINT chk_cancelled_by_type CHECK (cancelled_by_type IN ('USER', 'DRIVER', 'ADMIN')),
    265 
    266                                CONSTRAINT FK_Cancellations_Rides
    267                                    FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE
    268 );
    269 CREATE TABLE Messages(
    270                          message_id SERIAL PRIMARY KEY,
    271                          message_text VARCHAR(255) NOT NULL
    272 
    273 );
    274 CREATE TABLE Notifications (
    275                                notification_id SERIAL PRIMARY KEY,
    276                                message_id INT NOT NULL,
    277                                sent_time TIMESTAMP NOT NULL,
    278                                User_id INT NOT NULL,
    279                                ride_id INT NOT NULL,
    280                                status_id INT NOT NULL,
    281 
    282                                CONSTRAINT FK_Notifications_Users
    283                                    FOREIGN KEY (User_id) REFERENCES Users(User_id) ON DELETE CASCADE,
    284 
    285                                CONSTRAINT FK_Notifications_Rides
    286                                    FOREIGN KEY (ride_id) REFERENCES Rides(ride_id) ON DELETE CASCADE,
    287 
    288                                CONSTRAINT FK_Notifications_Status
    289                                    FOREIGN KEY (status_id) REFERENCES Status(status_id) ON DELETE RESTRICT,
    290 
    291                                CONSTRAINT FK_Notifications_Messages
    292                                     FOREIGN KEY (message_id) REFERENCES Messages(message_id) ON DELETE CASCADE
    293 );
    294 
    295